Deref 与 DerefMut
Deref
, DerefMut
trait 主要用于一些智能指针类型, 比如 Box
, Rc
, Arc
.
Deref
trait 的定义:
pub trait Deref: ?Sized {
type Target: ?Sized;
fn deref(&self) -> &Self::Target;
}
pub trait DerefMut: Deref {
// Required method
fn deref_mut(&mut self) -> &mut Self::Target;
}
Deref
trait 用于解析引用 (dereference) 操作, 比如 *v
.
Deref coercion
- 当需要调用
String::find()
方法, 而值r
的类型是Rc<String>
时, 可以直接写r.find('?')
, 不需要写完整的(*r).find('?')
, 因为&Rc<String>
自动被转换成了&String
类型 str
定义的方法, 都可以被String
对象直接使用, 因为&String
可以自动被转换成&str
Box<T>
的实现:
impl<T: ?Sized> Deref for Box<T> {
type Target = T;
fn deref(&self) -> &T {
&**self
}
}
impl<T: ?Sized> DerefMut for Box<T> {
fn deref_mut(&mut self) -> &mut T {
&mut **self
}
}
Vec<T>
也有实现:
impl<T> ops::Deref for Vec<T> {
type Target = [T];
#[inline]
fn deref(&self) -> &[T] {
unsafe { slice::from_raw_parts(self.as_ptr(), self.len) }
}
}
impl<T> ops::DerefMut for Vec<T> {
#[inline]
fn deref_mut(&mut self) -> &mut [T] {
unsafe { slice::from_raw_parts_mut(self.as_mut_ptr(), self.len) }
}
}