为何在Rust中对String(非&String)解引用可正常工作?
对String手动解引用却不报错的原因
这是因为Rust中的String类型实现了std::ops::Deref<Target = str> trait,这就赋予了它解引用的能力。
具体过程
- 当你执行
*s时,Rust会自动调用String的deref方法,该方法返回一个指向底层字符串切片的&str引用。 - 对这个
&str解引用后,会得到一个临时的str类型值——不过str是动态大小类型,不能直接持有,所以在调用len()方法时,Rust会自动将其转换为&str引用。 str类型的len()方法本身就是基于引用调用的,因此代码可以正常编译运行。
额外补充
其实你完全不需要手动写解引用,直接调用s.len()也能得到相同结果。这得益于Rust的**自动解引用(Deref Coercion)**机制:当调用方法时,Rust会自动对目标类型进行多层解引用,直到找到匹配的方法。比如s.len()、(*s).len()、(**&s).len()这几种写法的效果完全一致。
举个简化版的String的Deref实现,帮助理解:
impl Deref for String { type Target = str; fn deref(&self) -> &Self::Target { // 实际是返回指向底层字节数组对应的str引用 unsafe { std::str::from_utf8_unchecked(self.as_bytes()) } } }
内容的提问来源于stack exchange,提问作者luffy
相关产品推荐
相关产品推荐

