【问题标题】:Returning closure from a closure as return value for function从闭包返回闭包作为函数的返回值
【发布时间】:2019-05-18 18:21:02
【问题描述】:

我正在尝试习惯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 等)?

【问题讨论】:

    标签: rust closures traits


    【解决方案1】:

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

    `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),所以它是允许的。第二个是 trait 方法的返回类型,所以不是。

    如何在不使用堆的情况下做到这一点?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 2013-01-16
      • 2014-10-25
      相关资源
      最近更新 更多