通过简单模式在 Rust 中关闭生命周期
Closure lifetime in Rust through simple pattern
我正在尝试使用 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();
}
游乐场 link -> here
您需要move
将值放入闭包中:
fn get_closure(&self) -> Box<dyn Fn() -> ()> {
let value = self.value;
Box::new(move || {
if value {
println!("true");
} else {
println!("false");
}
})
}
请注意,在您的示例中,值是 bool
,即 Copy。如果没有,您可以捕获参考或克隆它。 (如果捕获参考,您可能需要在那里调整一些生命周期)。
Playground
我正在尝试使用 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();
}
游乐场 link -> here
您需要move
将值放入闭包中:
fn get_closure(&self) -> Box<dyn Fn() -> ()> {
let value = self.value;
Box::new(move || {
if value {
println!("true");
} else {
println!("false");
}
})
}
请注意,在您的示例中,值是 bool
,即 Copy。如果没有,您可以捕获参考或克隆它。 (如果捕获参考,您可能需要在那里调整一些生命周期)。
Playground