- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我是一名优秀的程序员,十分优秀!