gpt4 book ai didi

rust - 移动盒装函数时为 "cannot move a value of type FnOnce"

转载 作者:行者123 更新时间:2023-11-29 07:43:35 26 4
gpt4 key购买 nike

我正尝试在 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>是完全不同的类型。

Rust 1.35

Box<dyn FnOnce>现在可以调用了;您的原始代码按原样工作。

以前的版本

标准库中有一种类型可以解决这种情况: FnBox . 不幸的是,它不稳定。

您的替代选择是:

  • 重构代码,而不是 Box<FnOnce> ,您保留实际闭包类型。
  • 使用Box<FnMut>相反。
  • 等待FnBox稳定下来。
  • 切换到夜间编译器。

关于rust - 移动盒装函数时为 "cannot move a value of type FnOnce",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30411594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com