下面是存在一些生存期问题的代码:
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
的生存期?
1条答案
按热度按时间e5nqia271#
为什么不将传递给wrapper的生存期与内部的生存期连接起来呢?
所以我不明白为什么你会惊讶于它在这里定义的
'a
通过使用
take
,您可以从对象中删除引用,这样以后是否删除该对象就没有关系了。第一个示例将引用保留在原始对象内部,并从原始对象借用引用,而不是取出引用,因此除了
'a
约束之外,它的寿命不会超过原始对象。