目前,Rust还没有“特质专业化”功能。据我所知,这意味着对于一种给定类型,特征不能多次实现。但是,我注意到Borrow
trait已实现for T where T: ?Sized
,这些都是非引用类型(对吧?)。但它也适用于其他几种类型,如Vec<T>
,看起来像是一种专业化。
这是怎么回事?它是编译魔术还是我误解了什么特质专业化?
答案 0 :(得分:7)
在这种情况下,不需要特征专业化,因为实现是非重叠的。
在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>