当通用结构实现“Deref”时,实际上会生成什么代码?

What code will actually be generated when a generic struct implements `Deref`?

我真的不能理解这里的取消引用。 foo 的类型是 TattleTell<&str>。方法 len() 来自 foo.value,即 foo.value.len()。那么为什么调用 TattleTell 的 deref 呢?

use std::ops::Deref;
struct TattleTell<T> {
    value: T,
}
impl<T> Deref for TattleTell<T> {
    type Target = T;
    fn deref(&self) -> &T {
        println!("{} was used!", std::any::type_name::<T>());
        &self.value
    }
}
fn main() {
    let foo = TattleTell {
        value: "secret message",
    };
    // dereference occurs here immediately
    // after foo is auto-referenced for the
    // function `len`
    println!("{}", foo.len());
}

我不会完整描述 Rust 的 auto-dereferencing 规则,因为它们在其他答案中有所涉及。例如,.

在您的例子中,您正试图在 TattleTell<&'static str> 上调用方法 len。此类型不直接具有该方法,因此,使用 中的规则,Rust 会使用以下步骤寻找它:

  1. 检查 &TattleTell<&'static str> 上是否存在该方法。它没有。
  2. 检查 *&TattleTell<&'static str> 上是否存在该方法。由于您的 Deref 实施,这是一个 &'static str,因此该方法存在。