Lo schema di un tratto sicuro da oggetti Foo
e un tratto di estensione (potenzialmente pericoloso) FooExt
implementato per tutte le istanze di Foo
sembra diventare standard ora.Limitazioni dei tratti di estensione
https://github.com/rust-lang/rfcs/pull/445
Questo è un problema per me, nel caso di Iterator<A>
, come ho una libreria che sostituisce il metodo predefinito IteratorExt#last()
del vecchio iteratore tratto (la biblioteca di fondo ha un'implementazione efficiente di last()
). Questo è ormai impossibile, perché per qualsiasi A
, ci sarà sempre un'implementazione di tratto in conflitto di IteratorExt
, quella che libcore
fornisce già per tutti Iterator<A>
.
iterator.rs:301:1: 306:2 error: conflicting implementations for trait `core::iter::IteratorExt` [E0119]
iterator.rs:301 impl<'a, K: Key> iter::IteratorExt<Vec<u8>> for ValueIterator<'a,K,Vec<u8>> {
iterator.rs:302 fn last(&mut self) -> Option<Vec<u8>> {
iterator.rs:303 self.seek_last();
iterator.rs:304 Some(self.value())
iterator.rs:305 }
iterator.rs:306 }
...
Ora, per quanto vedo, ho due opzioni:
- avere il mio carattere e la mia
last()
implementazione. Ciò significherebbe conflitti se viene importatoIteratorExt
a meno che non venga usato con attenzione. Questo ha anche il pericolo di utilizzare accidentalmente una versione inefficiente dilast()
se viene utilizzata la versione daIteratorExt
. Avrei libero accesso aIteratorExt
. - hanno il mio tratto e denominano il metodo in modo diverso (
seek_last()
). Svantaggio: chiedo all'utente di imparare il vocabolario e di favorire sempre il mio metodo rispetto a quello fornito daIteratorExt
. Lo stesso problema: vorrei evitare l'uso accidentale dilast()
.
C'è qualche altra soluzione migliore che mi manca?
Non riesco a farlo funzionare con 'rustc 0.13.0-nightly (193390d0e 2014-12-11 22:56:54 +0000)'. Non sovrascrive il metodo, avverte per 'dead_code'. Mi piace come soluzione, però. – Skade
Scratch che, non ho reso pubblico il metodo per usarlo in un'altra cassa. Funziona con 'pub fn last (...)'. – Skade
Generalmente funziona in codice generico che consuma un tipo di questo tipo (con Iterator associato) e probabilmente vive in un'altra cassa? – sellibitze