2015-10-25 5 views
6

Attualmente, Rust non ha ancora la caratteristica "specializzazione dei tratti". Per quanto ho capito, questo significa che un tratto non può essere implementato più di una volta per un dato tipo. Tuttavia, ho notato che il Borrow trait è implementato for T where T: ?Sized che sono tutti i tipi non di riferimento ci sono (giusto?). Ma è anche implementato per molti altri tipi, come Vec<T>, che sembra una specializzazione.In che modo `Borrow` funziona senza specializzazione di tratto?

Come funziona? È una magia del compilatore o ho frainteso qual è la specializzazione dei tratti?

risposta

6

Risposta breve

In questo caso, caratteristica specializzazione non è necessaria, in quanto le implementazioni non si sovrappongono.

Risposta lunga

Nel caso particolare di Vec<T>, ci sono molti impls ad esso applicabili. Ad esempio, la seguente:

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 

Secondo tali implementazioni, il compilatore può dedurre la seguente:

  1. Vec<T> implementa Borrow<Vec<T>>
  2. &'a Vec<T> implementa Borrow<Vec<T>>
  3. &'a mut Vec<T> implementa Borrow<Vec<T>>

Tuttavia, nessuno di essi implementa Borrow<[T]> per Vec<T>. Dal momento che tale implementazione non viene fornita, sei libero di fornire il tuo:

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