我正在尝试习惯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 {
| ^^^^^^^^^^^^^^^^^^^^^
impl Fn
允许使用,但第二个不允许? Box
等)? 最佳答案
如果您仔细阅读该消息,它将确切说明问题所在:
目前,您只能使用impl Trait
:
fn
在impl
块外部使用。 fn
块中使用的impl Type
。 就是这样。
因此,您不能形成特征
Fn() -> impl X
。我希望指出的是,这是暂时的限制,因为正在进行工作以扩展可以使用
impl X
的位置,并且需要关联的类型和特征方法。第一个
impl Fn
是函数的返回类型(y
),因此它是允许的。第二个是特征方法的返回类型,所以不是。您可以从第一个
Fn
中返回一个具体实例。例如,如果您不需要状态,则可以返回
fn(bool) -> bool
。否则,您将需要手动创建一个封装该状态的结构,以便能够命名该类型,而不是依赖于闭包。
关于rust - 从闭包中返回闭包作为函数的返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56201717/