目前,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
根据这些实现,编译器可以推导出以下内容:
-
Vec<T>
工具Borrow<Vec<T>>
-
&'a Vec<T>
工具Borrow<Vec<T>>
-
&'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/