Wzorzec zachowania cechy obiektu Foo
i (potencjalnie niebezpiecznej) cechy FooExt
implementowanej dla wszystkich instancji Foo
wydaje się teraz standardem.Praca nad ograniczeniami cech rozszerzenia
https://github.com/rust-lang/rfcs/pull/445
To jest dla mnie problemem w przypadku Iterator<A>
, jak mam biblioteki, który zastępuje domyślną metodę IteratorExt#last()
starego iteratora (cecha podstawowa biblioteka posiada sprawną realizację last()
). To jest teraz niemożliwe, ponieważ dla każdego A
zawsze będzie występować sprzeczna implementacja cechy IteratorExt
, która już zapewnia libcore
dla wszystkich .
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 }
...
Teraz, o ile widzę, mam dwie opcje:
- mają własne cechy i moje własne
last()
realizację. Oznaczałoby to konflikt, jeśli zostanie zaimportowany, o ile nie zostanie starannie użyty. Zagrożenie to jest również przypadkowo używane w nieefektywnej wersjilast()
, jeśli używana jest wersja zIteratorExt
. Pozbawiłbym dogodnego dostępu doIteratorExt
. - Mam własną cechę i nazwę tej metody w inny sposób (
seek_last()
). Wada: proszę użytkownika, aby nauczył się słownictwa i zawsze faworyzował moją metodę nad tą dostarczoną przezIteratorExt
. Ten sam problem: chciałbym uniknąć przypadkowego użycialast()
.
Czy istnieje inne, lepsze rozwiązanie, którego mi brakuje?
Nie mogę uzyskać tego działającego z 'rustc 0.13.0-nightly (193390d0e 2014-12-11 22:56:54 +0000)'. Nie zastępuje metody, ostrzega o 'dead_code'. Podoba mi się to jednak jako rozwiązanie. – Skade
Zarysuj to, nie upubliczniłem tej metody, aby użyć jej w innej skrzyni. Działa z 'pub fn last (...)'. – Skade
Czy to na ogół działa w ogólnym kodzie, który pochłania taki typ (z połączeniem Iterator) i prawdopodobnie mieszka w innej skrzyni? – sellibitze