直接回答:当类型 T 实现了 Deref<Target = U>,编译器在需要 &U 的地方接受 &T,自动插入任意多层的 * 解引用。典型链:&String → &str、&Vec<T> → &[T]、&Box<T> → &T。这就是为什么函数签名写 s: &str 就能同时接收 &String 和字面量——标准库用 Deref 抹平了容器与视图类型的差异。
展开解析:触发点是类型不匹配时的隐式转换,发生在方法调用(方法查找沿 deref 链向上找)和显式传参两种场景。便利之外有两个坑:其一,Deref 只在有 & 时发生,String 赋给 &str 必须显式 &s,所有权不会自动借用;其二,自定义类型乱实现 Deref 制造"智能继承"是反模式——方法解析变得隐晦,Rust 社区共识是 Deref 只用于"智能指针指向单一值"的语义,想要复用行为请用组合加显式委托。还有个细节:DerefMut 要求 Deref,可变解引用走另一条链。写 API 时记住约定:参数尽量收 &str/&[T]/&Path 这类视图,而不是 &String/&Vec<T>,调用方更少摩擦。
追问方向:为什么 &Vec 能传给 &[T] 参数而 Vec 不能直接传给?AsRef 和 Deref 的区别?方法解析的完整顺序是什么?
(约 440 字)