如何在Rust结构中正确使用生命周期

时间:2018-04-05 03:37:22

标签: rust

我在其中一个包装盒中使用了以下结构。

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

我读过有关高级生命周期的内容,但无法弄清楚如何解决这个问题。如何正确设置生命周期?

2 个答案:

答案 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));
    }
}