当通用结构实现“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 会使用以下步骤寻找它:
- 检查
&TattleTell<&'static str>
上是否存在该方法。它没有。
- 检查
*&TattleTell<&'static str>
上是否存在该方法。由于您的 Deref
实施,这是一个 &'static str
,因此该方法存在。
我真的不能理解这里的取消引用。 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
。此类型不直接具有该方法,因此,使用
- 检查
&TattleTell<&'static str>
上是否存在该方法。它没有。 - 检查
*&TattleTell<&'static str>
上是否存在该方法。由于您的Deref
实施,这是一个&'static str
,因此该方法存在。