2016-09-02 17 views
5

Chcę zdefiniować cechę Container tak, że każdy implementator tej cechy musi również implementować IntoIterator, z zastrzeżeniem, że iteracja ZAWSZE pożycza tylko instancję. Jeśli dobrze rozumiem, mogę realizować IntoIterator stosując wzór tak:Ograniczenie rodzica do odniesienia

impl<'a> IntoIterator for &'a ContainerImpl 

jednak, w jaki sposób mogę określić, że to musi być realizowane, jeśli typ implementuje Container, np:

trait Container: &IntoIter ??? 

Odpowiedz

6

You można dodać where klauzuli do cech, zbyt (playground):

trait IterBorrow where for<'a> &'a Self: IntoIterator {} 
impl IterBorrow for [i32] {} // legal 
// impl IterBorrow for i32 {} // Illegal 

jednak wydaje się obecnie potrzeba powtórzyć ten związany gdy rzeczywiście chcesz iteracyjne, to funkcja ta nie kompiluje bez klauzuli WHERE:

fn foo<T: IterBorrow>(x: T) where for<'a> &'a T: IntoIterator { 
    for _ in &x {} 
    for _ in &x {} 
} 
+0

To ma sens, ale dodaje boilerplate jest dość niefortunne. Czy możesz wskazać mi dokument opisujący użycie <> w klauzuli where? Nie mogłem go nigdzie znaleźć .. – MrMobster

+0

@MrMobster Nazywane są one wyższymi granicami cech. Nie ma zbyt wiele dokumentacji, ale znalazłem to: https://doc.rust-lang.org/nomicon/hrtb.html – delnan

Powiązane problemy