用 Arc、Mutex 等包装一个变量,令我好奇的是,加上包装后,仍然可以直接使用变量的各种方法。例如下面的代码:
use std::sync::Arc;
struct Hello {}
impl Hello {
fn foo(&self) {}
}
fn main() {
let x = Arc::new(Hello {});
x.foo();
}
这是如何做到的呢?背后的奥秘是 Deref 特性。我写了一段代码,也能实现如此效果:
use core::ops::Deref;
struct Hello {}
impl Hello {
fn foo(&self) {}
}
struct MyBox<T> {
value: T,
}
impl<T> MyBox<T> {
fn new(x: T) -> Self {
Self { value: x }
}
}
impl<T> Deref for MyBox<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
fn main() {
let x = MyBox::new(Hello {});
x.foo();
}
哈哈,原来这个原理并不复杂呀!
最后,附上 Deref 的定义,供大家参考。
pub trait Deref {
type Target: ?Sized;
fn deref(&self) -> &Self::Target;
}