选项的 rust eclipse 寿命::take()

dddzy1tm  于 2023-03-18  发布在  Eclipse
关注(0)|答案(1)|浏览(171)

下面是存在一些生存期问题的代码:

struct Node<T>(T);

struct Wrapper<'a, T: 'a>(&'a mut Node<T>);

impl<'a, T: 'a> Wrapper<'a, T> {      
    // error: lifetime may not live long enough
    fn func(&mut self) -> &'a mut T {
        &mut self.0 .0
    }
}

我修复了上面代码的问题:

struct Wrapper<'a, T: 'a>(Option<&'a mut Node<T>>);

impl<'a, T: 'a> Wrapper<'a, T> {        
    fn func(&mut self) -> &'a mut T {
        // Option::take() 
        let node = self.0.take().unwrap();

        &mut node.0
    }
}

我的困惑是为什么Option::take()返回的引用node的生存期满足'a的生存期?

e5nqia27

e5nqia271#

为什么不将传递给wrapper的生存期与内部的生存期连接起来呢?

struct Wrapper<'a, T: 'a>(Option<&'a mut Node<T>>);

所以我不明白为什么你会惊讶于它在这里定义的'a

impl<'a, T: 'a> Wrapper<'a, T> {

通过使用take,您可以从对象中删除引用,这样以后是否删除该对象就没有关系了。
第一个示例将引用保留在原始对象内部,并从原始对象借用引用,而不是取出引用,因此除了'a约束之外,它的寿命不会超过原始对象。

相关问题