繁体   English   中英

从闭包返回闭包作为函数的返回值

[英]Returning closure from a closure as return value for function

我正在尝试习惯impl Fn ,但我不明白这段代码的错误:

fn y(state: bool) -> impl Fn() -> impl Fn(bool) -> bool {
    move || {
        println!("state, {}", state);
        |x: bool| {
            println!("state, {}", state);
            !x
        }
    }
}

fn main() {
    y(true)()(true);
}

错误是:

error[E0562]: `impl Trait` not allowed outside of function and inherent method return types
 --> src/main.rs:1:35
  |
1 | fn y(state: bool) -> impl Fn() -> impl Fn(bool) -> bool {
  |                                   ^^^^^^^^^^^^^^^^^^^^^
  1. 为什么允许第一个impl Fn ,但不允许第二个?
  2. 如何在不使用堆(通过Box等)的情况下完成此操作?

如果您仔细阅读该消息,它会准确解释问题所在:

 `impl Trait` not allowed outside of function and inherent method return types 

目前,您只能使用impl Trait

  • 作为函数的返回类型: fnimpl块之外使用。
  • 作为固有方法的返回类型: fnimpl Type块中使用。

就是这样。

因此,你不能形成特征Fn() -> impl X

我希望这是一个暂时的限制,因为正在进行的工作是扩展可以使用impl X的地方,并且需要相关的类型和特征方法。

为什么允许第一个impl Fn ,但不允许第二个?

第一个impl Fn是函数的返回类型( y ),因此允许它。 第二个是特征方法的返回类型,所以它不是。

如何在不使用堆的情况下完成此操作?

你可以从第一个Fn返回一个具体的实例。

例如,如果您不需要状态,则可以返回fn(bool) -> bool

否则,您需要手动创建一个封装所述状态的结构,以便能够命名该类型,而不是依赖于闭包。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM