object-safe trait
trait Iterator<A> {
fn next(&mut self) -> Option<A>;
}
// The extension trait offering object-unsafe methods
trait IteratorExt<A>: Iterator<A> {
fn chain<U: Iterator<A>>(self, other: U) -> Chain<Self, U> { ... }
fn zip<B, U: Iterator<B>>(self, other: U) -> Zip<Self, U> { ... }
fn map<B>(self, f: |A| -> B) -> Map<'r, A, B, Self> { ... }
...
}
может именно оно и надо? то есть для какого-то типа достаточно реализовать один-единственный метод next, и автоматом появятся chain, zip, map и другие
Тут немного наоборот получается
это-то меня и смущает в первую очередь )
А можно и прям в оригинальный трейт пихать.
можно, как и поступили с итераторами =)
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=acfc651d3577fbe2b301afbcf95f84d7 примерно оно и получилось, вроде
а, так это тогда даже не "наоборот", а очень даже "напрямую" )
Ну меня тут напрягает возможность run переимплиментировать
а её нет :) вручную Core уже не заимплементить из-за максимально обобщённого impl<T: Adapter> Core for T {}
Обсуждают сегодня