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

时间:2018-12-14 19:06:12

标签: syntax rust lifetime borrow-checker borrowing

以下摘录来自rust源代码的path.rs

impl AsRef<Path> for String {
    fn as_ref(&self) -> &Path {
        Path::new(self)
    }
}

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

1 个答案:

答案 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引用将具有与我们传入的引用相同的生存期,这正是返回值所需的生存期。