我在其中一个包装盒中使用了以下结构。
pub struct Set<'a, 'b: 'a, 'c: 'a + 'b> {
sockets: ManagedSlice<'a, Option<Item<'b, 'c>>>,
}
impl<'a, 'b: 'a, 'c: 'a + 'b> Set<'a, 'b, 'c> {
pub fn new<SocketsT>(sockets: SocketsT) -> Set<'a, 'b, 'c>
where
SocketsT: Into<ManagedSlice<'a, Option<Item<'b, 'c>>>>,
{
let sockets = sockets.into();
Set { sockets: sockets }
}
}
我需要将struct Set
作为另一个结构中的一个字段:
pub struct foo {
sockets: Set,
}
impl foo {
pub fn init(&mut self) {
self.sockets = Set::new(vec![]);
}
}
这会导致以下错误:
|
21 | sockets:Set,
| ^^^^^^^^^ expected 3 lifetime parameters
我读过有关高级生命周期的内容,但无法弄清楚如何解决这个问题。如何正确设置生命周期?
答案 0 :(得分:2)
这取决于您打算如何使用Foo
。将所有生命周期设置为'static
可能对您有用。否则,您需要向Foo
本身添加至少一个生命周期参数并使用它。根据您的使用情况,这可能就足够了:
pub struct Foo<'a> {
sockets:Set<'a, 'a, 'a>,
}
或者您可能需要添加两到三个生命周期参数:
pub struct Foo<'a, 'b: 'a, 'c: 'a + 'b> {
sockets:Set<'a, 'b, 'c>,
}
PS:作为旁注,您的foo
结构应该大写:Foo
。
答案 1 :(得分:2)
您需要为struct添加生命周期注释:
pub struct Foo<'a, 'b: 'a, 'c: 'a + 'b> {
sockets: Set<'a, 'b, 'c>,
}
并且还要impl,确保生命周期注释约束:
impl<'a, 'b: 'a, 'c: 'a + 'b> Foo<'a, 'b, 'c> {
...
}
例如,可能的实施:
impl<'a, 'b: 'a, 'c: 'a + 'b> Foo<'a, 'b, 'c> {
pub fn init(&mut self, v: &'a mut Vec<Option<Item<'b, 'c>>>) {
self.sockets = Set::new(ManagedSlice::Borrowed(v));
}
}