rust - `Borrow` 在没有特征特化的情况下如何工作?

标签 rust traits

目前,Rust 还没有“特质特化”的特性。据我了解,这意味着对于一个给定的类型,一个特性不能被实现多次。但是,我注意到 Borrow trait已实现for T where T: ?Sized这些都是非引用类型(对吗?)。但它也适用于其他几种类型,例如 Vec<T> ,这看起来像是一个专业。

它是如何工作的?是编译器魔术还是我误解了什么是特征特化?

最佳答案

简答

在这种情况下,特征特化不是必需的,因为实现是非重叠的。

长答案

Vec<T> 的特殊情况下,有许多适用于它的暗示。例如,以下内容:

impl<T> Borrow<T> for T where T: ?Sized
impl<'a, T> Borrow<T> for &'a T where T: ?Sized
impl<'a, T> Borrow<T> for &'a mut T where T: ?Sized
// other implementations are omitted for conciseness

根据这些实现,编译器可以推导出以下内容:

  1. Vec<T>工具 Borrow<Vec<T>>
  2. &'a Vec<T>工具 Borrow<Vec<T>>
  3. &'a mut Vec<T>工具 Borrow<Vec<T>>

但是,它们都没有实现 Borrow<[T]>对于 Vec<T> .由于未提供该实现,您可以自由提供自己的实现:

impl<T> Borrow<[T]> for Vec<T>

关于rust - `Borrow` 在没有特征特化的情况下如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33334135/

相关文章:

loops - 是否可以编写一个调用 BufRead::fill_buf 的函数,直到中断错误不再发生而不使用 unsafe?

rust - 为什么对我的 FFI 函数的第二次调用无法匹配字符串比较?

c++ - 使用类模板的内部类模板专门化模板

multithreading - 克隆和移动特征

intellij-idea - 使用 Rust IntelliJ 插件时如何运行我的主要功能?

multithreading - 是否可以仅使用 std 访问具有多个线程的不相交切片?

collections - 如何更新 BTreeSet 中的所有值?

rust - 如何将保存特征对象的结构克隆到 `Fn`

rust - 我怎样才能在原始 crate 中使用另一个 crate 中的特征实现?

元组中的 Rust trait 对象 --- 预期的 trait 对象,找到的类型