![](/img/trans.png)
[英]"borrowed value does not live long enough" after implementing Drop trait
[英]Getting “borrowed value does not live long enough” Error While Trying to Pass a Boxed dyn Trait into a Function
我是 rust 的新手,我对借用检查器的行为感到非常困惑。
trait Foo {
fn foo(&self);
}
struct Bar<'a> {
pub f : &'a Vec<i32>
}
impl<'a> Foo for Bar<'a> {
fn foo(&self) {
for i in self.f {
println!("{}", i);
}
}
}
fn call(b : &Box<dyn Foo>) {
b.foo();
}
fn main() {
let a = vec!(1,2,3);
let b : Box<dyn Foo> = Box::new(Bar {f : &a});
call(&b)
}
通过编译这段代码,我得到:
error[E0597]: `a` does not live long enough
--> main.rs:23:44
|
23 | let b : Box<dyn Foo> = Box::new(Bar {f : &a});
| ------------------^^--
| | |
| | borrowed value does not live long enough
| cast requires that `a` is borrowed for `'static`
24 | call(&b)
25 | }
| - `a` dropped here while still borrowed
有人可以向我解释为什么在这种情况下a
活得不够长吗? 在我看来,它将贯穿程序的整个生命周期。
默认情况下, Box<dyn Foo>
表示Box<dyn Foo + 'static>
,因此只有'static
值可以存储在Box<dyn Foo>
中。 a
在 function 中创建,因此它不适用于'static
。
您可以使用生命周期参数来调整生命周期:
fn call<'a>(b: &Box<dyn Foo + 'a>) {
b.foo();
}
( 操场)
注意main
function不是“程序的整个循环”。 有一些初始化代码在main
被调用之前运行,一些拆解代码在它返回之后运行。 因此,Rust 编译器处理main
的方式与任何其他 function 没有区别。
在您的情况下,由于您没有明确指定它,编译器假定要call
的参数是对Box<dyn Foo +'static>
的引用。 您可以通过自己指定生命周期来覆盖它:
fn call<'a>(b: &Box<dyn Foo + 'a>) {
b.foo();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.