自定义解引用
实现Deref trait可以覆盖默认的不可变引用的 * 运算,实现DerefMut trait可以覆盖默认的可变引用的 * 运算。
举例
// String 类型的定义中包含这个实现
impl ops::Deref for String {
type Target = str;
fn deref(&self) -> &str {
// 返回对底层字符串切片的引用
unsafe { str::from_utf8_unchecked(&self.vec) }
}
}
工作机制
当编译器遇到类型不匹配时,它会尝试寻找一系列 Deref trait 实现来弥合预期类型和实际类型之间的差距。列如:
&Box<String>
↓ Deref
&String
↓ Deref
&str
解引用强制转换仅发生于目标类型为引用(&T)的情况。它不适用于 Box 或 Vec 等自有权类型。其目的是避免不必要的克隆或移动值。
具体发生在三种情况:
1、From &T to &U when T: Deref<Target=U>
2、From &mut T to &mut U when T: DerefMut<Target=U>
3、From &mut T to &U when T: Deref<Target=U>
优势
- 自动实现方法。不仅在函数参数传递时,在方法调用 .method() 时也会自动 deref。
列如,当你为 &str 实现了一个方法,&String 会自动拥有这个方法,由于:
1、String 实现了 Deref<Target = str>
2、Rust 会自动将 &String 强制转换为 &str
- 编译时就确定,无运行时开销。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...


