我正在尝试在Rust中进行高阶编程,但在处理闭包时遇到了一些困难。以下是一个代码片段,说明了我遇到的问题之一:
pub enum Foo {
Bar(Box<FnOnce(i32)>),
}
pub fn app(i: i32, arg: Foo) {
match arg {
Foo::Bar(f) => f(i),
}
}
当我编译这段代码时,出现以下错误信息:
error[E0161]: cannot move a value of type std::ops::FnOnce(i32) + 'static: the size of std::ops::FnOnce(i32) + 'static cannot be statically determined
--> src/main.rs:7:24
|
7 | Foo::Bar(f) => f(i),
| ^
既然我把函数放在了一个Box
中,我本以为那样就能解决编译器不知道大小的问题。我该如何让上述程序编译通过呢?
Box<FnMut>
建议起作用,当我尝试时会出现错误。相反,我所做的就是只说Box<fn(i32)>
。这帮助我编译了上面的例子。然而,我无法使用该类型创建枚举,因为它与闭包的类型不匹配。所以我想我只能尝试使用夜间编译器了。 - svenningssonBox<FnMut(i32)>
代替;因为FnMut
是“对象安全”的,所以您可以通过Box
(或任何间接方式)调用它。唯一不能做的事情是让闭包消耗值(尽管您可以通过Option
解决这个问题)。 - DK.FnMut
需要在调用时能够改变闭包的值,因此请使用Foo::Bar(mut f) => f(i)
来使f
绑定可变。 - DK.FnMut
阻止我创建我喜欢的闭包类型,但这是一个不同的问题,也许我可以找到一个解决办法。 - svenningssonFnBox
解决了我的问题。再次感谢! - svenningsson