gpt4 book ai didi

rust - 如何使用 'static lifetime for a struct with lifetime ' a 实现特征?

转载 作者:行者123 更新时间:2023-11-29 07:57:09 25 4
gpt4 key购买 nike

我有一个 trait Surface: 'static我想为 struct Obj<'a> 实现.特征需要是 'static因为我想存储 Surface 类型的对象在Vec<Box<Surface>> .

第一步我试过这个。

impl<'a> Surface for Obj<'a> {}

这将不起作用,因为 'static 之间的生命周期不匹配和 'a .换句话说:Surface可以活得比Obj长因为Surface'static .我按如下方式更改了我的实现。

impl<'a> Surface for Obj<'a> where 'a: 'static {}

据我对文档的正确理解,我正在做的是,'a可以活得更久 'static .我想要这个吗?

如果我转让 Obj<'a> 的所有权,编译器告诉我内部有一个可变引用 Obj活不了多久,还是借来的。

这是一个简短的例子。

trait Surface: 'static {}

struct Manager {
storage: Vec<Box<Surface>>,
}

impl Manager {
fn add(&mut self, surface: impl Surface) {
self.storage.push(Box::new(surface));
}
}

struct SomeOtherStruct {}

struct Obj<'a> {
data: &'a mut SomeOtherStruct,
}

impl<'a> Obj<'a> {
fn new(some_struct: &'a mut SomeOtherStruct) -> Self {
Obj { data: some_struct }
}
}

impl<'a> Surface for Obj<'a> where 'a: 'static {}

fn main() {
let mut some_struct = SomeOtherStruct {};
let mut manager = Manager {
storage: Vec::new(),
};

let obj = Obj::new(&mut some_struct);
manager.add(obj);
}

( Playground )

error[E0597]: `some_struct` does not live long enough
--> src/main.rs:33:24
|
33 | let obj = Obj::new(&mut some_struct);
| ---------^^^^^^^^^^^^^^^^-
| | |
| | borrowed value does not live long enough
| argument requires that `some_struct` is borrowed for `'static`
34 | manager.add(obj);
35 | }
| - `some_struct` dropped here while still borrowed

换句话说 &mut some_struct是一生'a但需要'static .好的,这很清楚,因为 some_struct住在Obj<'a>所以它不可能是'static

这就是我想要做的“Rust like”吗?我不知道如何让它工作。它真的与生命周期混淆。我想我可以通过使用 Rc<T> 来解决这个问题, 但这会使事情变得更加复杂。

最佳答案

How to implement a trait with 'static lifetime for a struct with lifetime 'a?

你不会也不能。 'static 生命周期的目的是说“在整个程序期间都存在的东西”。没有任意生命周期 'a 满足此要求除了 'static 本身。

关于rust - 如何使用 'static lifetime for a struct with lifetime ' a 实现特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55157003/

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