Deref

智能指针实现了Deref特征。Deref可以让智能指针像引用那样工作,这样就可以同时支持智能指针和引用的代码。

一个类型为T的对象foo,如果T:Deref<Target=U>,相关foo的引用&foo在应用的时候会自动转换为&U

use std::ops::Deref;
 
struct MyBox<T>(T);
 
impl<T> MyBox<T> {
    fn new(x: T) -> MyBox<T> {
        MyBox(x)
    }
}
 
impl<T> Deref for MyBox<T> {
    type Target = T;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}
 
fn test(a: &i32) {
    println!("{}", *a);
}
 
fn main() {
    let y = MyBox::new(t);
    // &y: &MyBox<i32>
    test(&y);
}

test(&y)传入的是&MyBox<i32>,被自动转换为了&i32


在实现了Deref特征之后,就可以对智能指针进行解引用操作。

fn main() {
    let y = MyBox::new(5);
    assert_eq!(5, *y);
}

当对智能指针进行解引用时,实际上调用了*(y.deref())


隐式 Deref 转换

fn main() {
    let s = String::from("hello world");
    display(&s)
}
 
fn display(s: &str) {
    println!("{}", s);
}

String是一个智能指针,实现了Deref特征。在以上代码中将变量s进行了隐式转换,由&String类型转换为了&str(字符串切片)类型。