如果没有特质专业化,"借用"如何运作?

Luk*_*odt 7 traits rust

目前,Rust还没有"特质专业化"功能.据我所知,这意味着对于一种给定类型,特征不能多次实现.然而,我注意到,Borrow特点是实现for T where T: ?Sized这些都是非引用类型有(右?).但它也适用于其他几种类型,例如Vec<T>,它们看起来像专业化.

这怎么样?它是编译器魔术还是我误解了什么特质专业化?

aoc*_*via 7

简短的回答

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

答案很长

在特定情况下Vec<T>,有许多适用于它的impl.例如,以下内容:

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
Run Code Online (Sandbox Code Playgroud)

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

  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>
Run Code Online (Sandbox Code Playgroud)