You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在Rust中对String(非&String)解引用可正常工作?

对String手动解引用却不报错的原因

这是因为Rust中的String类型实现了std::ops::Deref<Target = str> trait,这就赋予了它解引用的能力。

具体过程

  1. 当你执行*s时,Rust会自动调用String的deref方法,该方法返回一个指向底层字符串切片的&str引用。
  2. 对这个&str解引用后,会得到一个临时的str类型值——不过str是动态大小类型,不能直接持有,所以在调用len()方法时,Rust会自动将其转换为&str引用。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:12:38