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

时间:2015-10-25 19:32:51

标签: rust traits

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

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

1 个答案:

答案 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

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

  1. Vec<T>实施Borrow<Vec<T>>
  2. &'a Vec<T>实施Borrow<Vec<T>>
  3. &'a mut Vec<T>实施Borrow<Vec<T>>
  4. 但是,它们都没有为Borrow<[T]>实施Vec<T>。由于未提供该实施,您可以自由提供:

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