基于官方文档进行简单学习记录,保证所有示例是可运行的基本单元。测试
rust
程序除了使用官方的playground
之外,还可以通过定义[[example]]
来运行程序。
文章目录
- [1. Deref](#1. Deref)
- [2. DerefMut](#2. DerefMut)
1. Deref
用于不可变对象的解引用操作,语法类似*v
。
官方文档: https://doc.rust-lang.org/std/ops/trait.Deref.html
trait源码
rust
pub trait Deref {
type Target: ?Sized;
// Required method
fn deref(&self) -> &Self::Target;
}
备注: Deref
和 DerefMut
设计之初就是为了适配和简化智能指针而设计的,应该避免为非智能指针实现相关trait
,以造成混淆。
Deref coercion
假设类型T
实现了Deref<Target = U>
trait,有一个类型为T
的变量x
,有下面几条规则成立:
*x
等价于*Deref::deref(&x)
- 类型
T
必须实现所有类型U
的不可变方法
应用示例
rust
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::<char> = DerefExample { value: 'a' };
let target: char = *x;
// a a
println!("{} {}", target, 'a');
}
2. DerefMut
用于可变对象的解引用操作,语法类似*v = 1
。
官方文档: https://doc.rust-lang.org/std/ops/trait.DerefMut.html
trait源码
rust
pub trait DerefMut: Deref {
// Required method
fn deref_mut(&mut self) -> &mut Self::Target;
}
DerefMut coercion
假设类型T
实现了DerefMut<Target = U>
trait,有一个类型为T
的变量x
,有下面几条规则成立:
*x
等价于*DerefMut::deref_mut(&mut x)
- 类型
T
必须实现所有类型U
的可变和不可变方法
应用示例
rust
use std::ops::{Deref, DerefMut};
struct DerefMutExample<T> {
value: T,
}
impl<T> Deref for DerefMutExample<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.value
}
}
impl<T> DerefMut for DerefMutExample<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.value
}
}
fn main() {
let mut x: DerefMutExample::<char> = DerefMutExample { value: 'a' };
// a a
println!("{} {}", *x, 'a');
*x = 'b';
// b a
println!("{} {}", *x, 'a');
}