如何编写代码从无生命周期值中解引用出带生命周期的值?
问题解答:从无生命周期结构体解引用出带生命周期的值
你的代码无法通过编译,核心问题是deref方法内创建的B是临时变量,它的生命周期仅局限于方法内部,返回的引用会变成悬垂引用,Rust的借用检查器会直接拦截这种不安全的行为。
要实现从A解引用得到带生命周期的B,需要让B的生命周期与A的实例绑定,调整Deref的实现如下:
use std::ops::Deref; struct A { x: String, } struct B<'a> { y: &'a str, } // 写法一:为A的引用实现Deref impl<'a> Deref for &'a A { type Target = B<'a>; fn deref(&self) -> &Self::Target { &B { y: &self.x } } } // 写法二:直接为A实现带生命周期关联的Deref(Rust 1.33+支持) impl<'a> Deref for A { type Target = B<'a>; fn deref(&'a self) -> &Self::Target { &B { y: &self.x } } }
补充说明
- 写法一中,我们为
&'a A(A的引用)实现Deref,这样对A的引用解引用时,得到的B<'a>生命周期与原A的引用完全一致,避免了悬垂问题。 - 写法二通过显式标注
&'a self,让Target的生命周期直接绑定到self的生命周期,同样能保证引用安全。
不过更符合Rust惯用风格的做法是避免隐式的Deref转换,直接在A中写一个方法来生成B:
impl A { fn into_b(&self) -> B<'_> { B { y: &self.x } } }
这种写法更直观,也能避免隐式转换带来的代码可读性问题。
内容的提问来源于stack exchange,提问作者Bayou
相关产品推荐
相关产品推荐

