2015-10-25 32 views
6

目前,Rust還沒有「特質專業化」功能。據我所知,這意味着一種特定類型的特徵不能被實施一次以上。但是,我注意到Borrow trait實施for T where T: ?Sized這是所有非參考類型(右?)。但它也適用於其他幾種類型,如Vec<T>,看起來像專業化。`借用'如何在沒有特質專業化的情況下工作?

這是如何工作的?它是編譯器的魔力還是我誤解了什麼特質專業化?

回答

6

短的答案

在這種情況下,特徵專業化是沒有必要的,因爲實現是不重疊的。

龍答案

Vec<T>的特殊情況下,也有適用於它的許多impls。例如,以下內容:

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

但是,它們都沒有爲Vec<T>實施Borrow<[T]>。由於沒有提供實施,您可以自行提供:

impl<T> Borrow<[T]> for Vec<T> 
相關問題