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的借用检查规则?堆栈对象应仅具有当前帧的生存期,并且临时对象的返回引用应产生错误.
返回的引用不指向在其中新创建的某个对象,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引用将与我们传入的引用具有相同的生命周期,这正是返回值所需的生命周期.
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |