关于Rust中std::path::Path::as_ref实现的两处疑问
Rust中
AsRef<Path>针对str的实现疑问解答 先看标准库中的这段实现:
impl AsRef<Path> for str { #[inline] fn as_ref(&self) -> &Path { Path::new(self) } }
针对你提出的两个疑问,解答如下:
为何自有对象会自动转换为引用?
其实这里不存在“自有对象自动转引用”的情况——Path::new的返回值本身就是&Path,不是自有对象。Path是一个动态大小类型(DST),它无法被实例化为拥有所有权的对象,只能以引用(&Path)的形式存在。查看Path::new的签名就能明白:pub fn new<S: AsRef<OsStr> + ?Sized>(s: &S) -> &Path,它接收一个引用参数,返回的是绑定了该参数生命周期的&Path。所以这段代码里只是直接返回了Path::new生成的引用,没有任何隐式转换。为何当自有对象超出作用域被释放时,不会产生运行时错误?
&Path本质上是对原str的一种“视图”,它并没有分配新的内存,引用的底层数据还是原str的内容。as_ref方法返回的&Path的生命周期和输入的&self(也就是原str的引用)完全绑定,只要原str还在作用域内,&Path就是有效的。当原str被释放时,&Path也会随之失效,但Rust的生命周期检查会在编译阶段就保证不会出现这种悬垂引用的情况,所以不会产生运行时错误。
内容的提问来源于stack exchange,提问作者Gerhard77
相关产品推荐
相关产品推荐

