如何从函数的堆栈返回对Path的引用?

jit*_*unc 6 syntax lifetime rust borrow-checker borrowing

以下代码段来自path.rs的锈源代码

impl AsRef<Path> for String {
    fn as_ref(&self) -> &Path {
        Path::new(self)
    }
}
Run Code Online (Sandbox Code Playgroud)

它似乎Path从堆栈帧返回新创建的对象的引用.它如何绕过Rust的借用检查规则?堆栈对象应仅具有当前帧的生存期,并且临时对象的返回引用应产生错误.

Sve*_*ach 6

返回的引用不指向在其中新创建的某个对象,as_ref()而是指向作为参数传递的字符串的数据.

让我们明确相关函数的生命周期.原型

fn as_ref(&self) -> &Path
Run Code Online (Sandbox Code Playgroud)

可以贬低

fn as_ref(&'a self) -> &'a Path
Run Code Online (Sandbox Code Playgroud)

selfis 的类型&'a String,对具有生命周期的字符串的引用'a.

在函数体内,Path::new()被称为.根据文档,它定义如下:

pub fn new<S: AsRef<OsStr> + ?Sized>(s: &S) -> &Path
Run Code Online (Sandbox Code Playgroud)

添加elided生命周期给出

pub fn new<S: AsRef<OsStr> + ?Sized>(s: &'a S) -> &'a Path
Run Code Online (Sandbox Code Playgroud)

所以新创建的Path引用将与我们传入的引用具有相同的生命周期,这正是返回值所需的生命周期.