上一篇: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');
}