以下摘录来自rust源代码的path.rs
impl AsRef<Path> for String {
fn as_ref(&self) -> &Path {
Path::new(self)
}
}
似乎正在从堆栈帧返回对新创建的Path
对象的引用。它如何绕过Rust的借阅检查规则?堆栈对象应仅对当前帧具有生存期,而返回临时对象的引用应产生错误。
答案 0 :(得分:6)
返回的引用并不指向as_ref()
内部新创建的某个对象,而是指向作为参数传入的字符串数据。
让我们明确说明相关功能的生命周期。原型
fn as_ref(&self) -> &Path
可以替代
fn as_ref(&'a self) -> &'a Path
self
的类型为&'a String
,是对寿命为'a
的字符串的引用。
在函数体内,调用Path::new()
。根据文档,它的定义如下:
pub fn new<S: AsRef<OsStr> + ?Sized>(s: &S) -> &Path
增加淘汰的寿命即可
pub fn new<S: AsRef<OsStr> + ?Sized>(s: &'a S) -> &'a Path
因此,新创建的Path
引用将具有与我们传入的引用相同的生存期,这正是返回值所需的生存期。