Rust 中的闭包生命周期通过简单的模式
Posted
技术标签:
【中文标题】Rust 中的闭包生命周期通过简单的模式【英文标题】:Closure lifetime in Rust through simple pattern 【发布时间】:2021-12-16 06:36:35 【问题描述】:我正在尝试使用 2 个结构在 Rust 中重新创建一个简单的回调模式。只要另一个准备好,一个就会传递一些逻辑来执行。这里的问题是,只有当结构中的某个值为真时,逻辑才会运行。
我可以理解为什么在这种情况下对 Foo 的引用需要为 'static
存在,但我不确定如何重构以便编译。
似乎是一个非常常规的用例,但也许我错过了一些东西,因为我是 Rust 的新手。
struct Foo
value: bool,
struct Bar
closure: Box<dyn Fn() -> ()>,
impl Foo
fn new() -> Self
Foo
value: false,
fn set_closure(&self, b: &mut Bar)
b.closure = self.get_closure();
fn get_closure(&self) -> Box<dyn Fn() -> ()>
return Box::new(||
if self.value
println!("true");
else
println!("false");
);
impl Bar
fn new() -> Self
Bar
closure: Box::new(|| )
fn main()
let foo = Foo::new();
let mut bar = Bar::new();
foo.set_closure(&mut bar);
let closure = bar.closure;
closure();
游乐场链接 -> here
【问题讨论】:
【参考方案1】:你需要将move
的值放入闭包中:
fn get_closure(&self) -> Box<dyn Fn() -> ()>
let value = self.value;
Box::new(move ||
if value
println!("true");
else
println!("false");
)
请注意,在您的示例中,值为bool
,即复制。如果没有,您可以捕获引用或克隆它。 (如果捕获参考,您可能需要在那里调整一些生命周期)。
Playground
【讨论】:
@Stargateur 感谢您的风格修正以上是关于Rust 中的闭包生命周期通过简单的模式的主要内容,如果未能解决你的问题,请参考以下文章