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

Rust 从闭包返回闭包作为函数的返回值,rust,closures,traits,Rust,Closures,Traits,我试图习惯于impl Fn,但我不理解此代码的错误: fn y(state: bool) -> impl Fn() -> impl Fn(bool) -> bool { move || { println!("state, {}", state); |x: bool| { println!("state, {}", state); !x } } } fn main(

我试图习惯于
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);
}
错误是:

错误[E0562]:`impl Trait`不允许在函数和固有方法返回类型之外
-->src/main.rs:1:35
|
1 | fn y(状态:bool)->impl fn()->impl fn(bool)->bool{
|                                   ^^^^^^^^^^^^^^^^^^^^^
  • 为什么第一个
    impl Fn
    允许它,而第二个不允许它
  • 如何在不使用堆的情况下(通过
    Box
    等)实现这一点

  • 如果您仔细阅读此消息,它将准确地解释问题所在:

    `impl Trait`不允许在函数和固有方法返回类型之外
    
    目前,您只能使用
    impl Trait

    • 作为函数的返回类型:
      fn
      impl
      块之外使用
    • 作为固有方法的返回类型:
      fn
      用于
      impl-type
    就这样

    因此,您不能形成trait
    Fn()->impl X

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

    为什么第一个
    impl Fn
    允许它,而第二个不允许它

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

    如何在不使用堆的情况下实现这一点

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

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

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