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



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

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

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

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

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

最新更新