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