在闭包中通过引用保存一个值
Keeping a value by reference inside a closure
鉴于以下示例,我想在我的闭包中通过引用使用 z
:
struct Foo<'a> {
x: Box<dyn Fn() + Send + Sync + 'a>,
y: Box<dyn Fn() + Send + Sync + 'a>,
}
impl<'a> Foo<'a> {
fn new(z: &'a str) -> Foo<'a> {
let x = Box::new(|| { z; });
let y = Box::new(|| { z; });
Foo {
x,
y,
}
}
}
然而,这个实现给出了错误:
closure may outlive the current function, but it borrows 'z', which is owned by the current function
.
我可以使用 move
,但我想通过引用来完成。我怎样才能让编译器满意?
我目前的想法是将函数和闭包设置为相同的生命周期,但我找不到相关文档。
I can use move but I'd like to do it by reference. How can I satisfy the compiler?
在这种情况下,您是通过引用来完成的。 z 已经是一个参考,所以你会 move
一个参考。通过省略 move
,您将创建一个 &'b &'a str
类型的新引用(&'b
仅存在于您的函数内部)。
鉴于以下示例,我想在我的闭包中通过引用使用 z
:
struct Foo<'a> {
x: Box<dyn Fn() + Send + Sync + 'a>,
y: Box<dyn Fn() + Send + Sync + 'a>,
}
impl<'a> Foo<'a> {
fn new(z: &'a str) -> Foo<'a> {
let x = Box::new(|| { z; });
let y = Box::new(|| { z; });
Foo {
x,
y,
}
}
}
然而,这个实现给出了错误:
closure may outlive the current function, but it borrows 'z', which is owned by the current function
.
我可以使用 move
,但我想通过引用来完成。我怎样才能让编译器满意?
我目前的想法是将函数和闭包设置为相同的生命周期,但我找不到相关文档。
I can use move but I'd like to do it by reference. How can I satisfy the compiler?
在这种情况下,您是通过引用来完成的。 z 已经是一个参考,所以你会 move
一个参考。通过省略 move
,您将创建一个 &'b &'a str
类型的新引用(&'b
仅存在于您的函数内部)。