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) }
}
}