【发布时间】:2020-03-26 21:13:51
【问题描述】:
我试图了解为什么在尝试编译以下代码时收到错误
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。
【问题讨论】:
-
虽然我不完全理解错误消息,但它与对所有内容使用相同的生命周期
'a有关。从除RefHolder<'a>之外的任何地方删除它会使其编译,这是你想要的吗? -
这段代码对我来说感觉很奇怪(带有 ref 的结构可以使用相同的生命周期参数创建更多自身的 ref),但我开始认为它实际上可能揭示了一个编译器错误。特别是,如果您在
main的每一行之后引入显式嵌套范围,当main的顶部范围内除了c之外没有其他内容时,您仍然会收到错误。 -
这是一个更完整的示例,展示了我想要做什么。本质上,我想存储装箱的 trait 对象,并在所述 trait 上有一个方法,该方法可能会将对所述 trait 对象的引用插入到提供的列表中。虽然代码有点不同,但我得到了同样的错误“借来的值不够长”play.rust-lang.org/…
-
@captaine 我认为这是stackoverflow.com/questions/32300132/…的一个非常复杂的版本
标签: rust