2015-08-04 8 views
8

Ho creato un esempio minimale che illustra un problema di inferenza di tipo che non sono riuscito a risolvere.annotazioni di tipo richieste nel contesto di tipi associati e iteratori

trait A<'a> { 
    type Item: Copy; 
    type Iter: Iterator<Item=Self::Item>; 

    fn items(&'a self) -> Self::Iter; 

    fn consume(&'a self, i: Self::Item) -> Self::Item; 

    fn f(&'a self) { 
     let _ = self.items().map(|i| self.consume(i) as Self::Item); 
    } 
} 

L'errore del compilatore è

x.rs:10:30: 10:68 error: type annotations required: cannot resolve `<<Self as A<'_>>::Iter as core::iter::Iterator>::Item == _` [E0284] 
x.rs:10   let _ = self.items().map(|i| self.consume(i) as Self::Item); 

Ho guardato altre domande su che richiedono le annotazioni di tipo, ma questo sembra essere un caso particolare che coinvolge tipi associati.

+0

Avete bisogno del 'a' 'nel vostro caso reale ? Rimuovendolo e consentendo l'inferenza a vita, il codice viene compilato. – Shepmaster

+0

Sì, ho bisogno della vita. Il mio codice funzionava senza vita, ma devo aggiungerlo, quindi compilare il codice per la ragione per cui ho posto la domanda. Grazie per l'aiuto. – malbarbo

risposta

6

Penso che questo sia #24338 ed è causato dal fatto che il compilatore si confonde per la durata nel tratto e il tipo associato. Può essere lavorato intorno spostando il corpo del metodo f in una funzione separata (conta nidificati come separato, dato che sono di tipo controllato in modo indipendente):

trait A<'a> { 
    // ... 

    fn f(&'a self) { 
     f_body(self); 

     fn f_body<'a, T: ?Sized + A<'a>>(x: &'a T) { 
      let _ = x.items().map(|i| x.consume(i) as T::Item); 
     } 
    } 
} 
Problemi correlati