Rust Deref Coeicion解引用强制转换

自定义解引用

实现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 等自有权类型。其目的是避免不必要的克隆或移动值

具体发生在三种情况:

1From &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 会自动拥有这个方法,由于:
 1String 实现了 Deref<Target = str>
 2、Rust 会自动将 &String 强制转换为 &str
  • 编译时就确定,无运行时开销。
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...