上一篇:Rust系列(三) 类型系统与trait
基于官方文档进行简单学习记录,保证所有示例是可运行的基本单元。测试
rust
程序除了使用官方的playground
之外,还可以通过定义[[example]]
来运行程序。
1. Deref
用于不可变对象的解引用操作,语法类似*v
。
官方文档:https://doc.rust-lang.org/std/ops/trait.Deref.html
trait源码
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
的不可变方法
应用示例文章来源地址https://www.toymoban.com/news/detail-620707.html
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源码
pub trait DerefMut: Deref {
// Required method
fn deref_mut(&mut self) -> &mut Self::Target;
}
DerefMut coercion
假设类型T
实现了DerefMut<Target = U>
trait,有一个类型为T
的变量x
,有下面几条规则成立:文章来源:https://www.toymoban.com/news/detail-620707.html
-
*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 a
println!("{} {}", *x, 'a');
*x = 'b';
// b a
println!("{} {}", *x, 'a');
}
到了这里,关于Rust系列(四) trait备忘录(持续更新)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!