作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正尝试在 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
中,我原以为这样可以解决编译器不知道大小的问题。如何编译上述程序?
最佳答案
这是 FnOnce
trait 的定义(简化了一点):
pub trait FnOnce<Args> {
type Output;
fn call_once(self, args: Args) -> Self::Output;
}
调用FnOnce
闭包,您需要能够将闭包值本身移动到调用中。注意 self
必须是实际的闭包类型;一个Box<dyn FnOnce>
是完全不同的类型。
Box<dyn FnOnce>
现在可以调用了;您的原始代码按原样工作。
标准库中有一种类型可以解决这种情况: FnBox
. 不幸的是,它不稳定。
您的替代选择是:
Box<FnOnce>
,您保留实际闭包类型。Box<FnMut>
相反。FnBox
稳定下来。关于rust - 移动盒装函数时为 "cannot move a value of type FnOnce",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30411594/
我是一名优秀的程序员,十分优秀!