RefHolder; } struct SomeType; impl Foo fo-6ren">
gpt4 book ai didi

rust - 理解错误 "Borrowed value does not live long enough"

转载 作者:行者123 更新时间:2023-12-03 11:30:04 25 4
gpt4 key购买 nike

我试图理解为什么在尝试编译以下代码时收到错误

trait Foo<'a> {
fn foo(&'a self) -> RefHolder<'a>;
}

struct SomeType;
impl<'a> Foo<'a> for SomeType {
fn foo(&'a self) -> RefHolder<'a> {
RefHolder(self)
}
}

struct RefHolder<'a>(&'a (dyn Foo<'a>));
struct Container<'a> {
pub objs: Vec<Box<dyn Foo<'a>>>,
}

fn main() {
let mut c = Container { objs: Vec::new() };
c.objs.push(Box::from(SomeType {}));

let o = &c.objs[0].as_ref();
let x = o.foo();
}

我收到错误

error[E0597]: `c.objs` does not live long enough
--> src/main.rs:21:14
|
21 | let o = &c.objs[0].as_ref();
| ^^^^^^ borrowed value does not live long enough
22 | let x = o.foo();
23 | }
| -
| |
| `c.objs` dropped here while still borrowed
| borrow might be used here, when `c` is dropped and runs the destructor for type `Container<'_>`

我很困惑为什么 c.objs 仍然在 main 的末尾借用。据我了解,x 将首先被删除,然后是 o,这意味着此时不应存在对 c 的引用,允许 c 最终被毫无问题地删除。

最佳答案

当编译器说借用的值没有足够长的生命周期时,它实际上意味着这个值的生命周期超出了它的范围。编译器以这种方式表达它,因为这是违反生命周期的最常见原因,但由于生命周期的推导方式,您的代码恰好更加复杂。

代码中的关键行是:

let x = o.foo();

有了它,代码编译得很好。其实就相当于这个

let o : &dyn Foo = c.objs[0].as_ref();
Foo::foo(o);

(不需要额外的 &,但这并不重要)。

现在 o 的生命周期是多少?引用?好吧,因为它是从 Box::as_ref() 初始化的这被定义为(未删除的生命周期):

fn as_ref<'s>(&'s self) -> &'s T

它与Box的生命周期相同本身,它是从向量中获取的,使用 Index trait...所以它最终将成为c.objs的生命周期.

现在,由于您的特征定义方式:

fn foo(&'a self) -> RefHolder<'a>

返回的特征具有相同的生命周期。由于代码中的每个泛型都使用相同的生命周期,因此 Container<'a> 的生命周期也是如此.

c: Container<'?>的具体生命周期是其成员之一的一生。这类似于自引用结构,这是不允许的。

只需删除除实际需要的那些之外的所有生命周期泛型,您的代码就可以轻松编译:

trait Foo {
fn foo<'a>(&'a self) -> RefHolder<'a>;
}

struct SomeType;
impl Foo for SomeType {
fn foo<'a>(&'a self) -> RefHolder<'a> {
RefHolder(self)
}
}

struct RefHolder<'a>(&'a (dyn Foo));
struct Container {
pub objs: Vec<Box<dyn Foo>>,
}

fn main() {
let mut c = Container { objs: Vec::new() };
c.objs.push(Box::from(SomeType {}));

let o : &dyn Foo = c.objs[0].as_ref();
let x = o.foo();
}

关于rust - 理解错误 "Borrowed value does not live long enough",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60876226/

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