pub trait Deref {
type Target: ?Sized;
// Required method
fn deref(&self) -> &Self::Target;
}
用于不可变的解引用操作,例如 *v ( immutable dereferencing operations)。
除了在不可变上下文中使用(一元)* 运算符进行显式解引用操作(for explicit dereferencing operations with the (unary) * operator in immutable contexts)之外,Deref 还在许多情况下由编译器隐式使用。这种机制称为“Deref 强制 Deref coercion”;在可变上下文中,请使用 DerefMut。
为智能指针实现 Deref 可以方便地访问其背后的数据(makes accessing the data behind them convenient),这就是他们实现 Deref 的原因。另一方面,关于 Deref 和 DerefMut 的规则是专门为适应智能指针而设计的(were designed specifically)。因此,Deref 应该仅针对智能指针实现,以避免混淆。
出于类似的原因,这个特性永远不应该失败。当隐式调用 Deref (invoked implicitly)时,解引用期间(Failure during dereferencing)的失败可能会非常令人困惑。
If T implements Deref
use std::ops::Deref;
struct DerefExample<T> {
value: T
}
impl<T> Deref for DerefExample<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
fn main() {
let x = DerefExample {
value: