Próbuję znaleźć powtórzenia w sekwencji iterowalnej. Ponadto chcę poznać elementy, które pojawiły się w tej sekwencji do tego momentu."Czas życia związany z niezgodnością typu" kontra "czas życia betonu" przy wypełnianiu kolekcji z zamknięcia
Stworzyłem HashMap
i próbuję zadzwonić pod numer insert
z zamknięcia używanego przez take_while
. Do tej pory jednak nie udało mi się zmusić go do kompilacji z powodu niedopasowania typu związanego z konkretnymi/związanymi okresami życia.
Tutaj jest uproszczoną wersją mojego kodu, który wykazuje ten sam błąd:
use std::collections::HashSet;
fn main() {
let mut seq = HashSet::new();
let mut insert = |k| seq.insert(k);
(1..10).cycle().take_while(insert);
}
Oto błędy uzyskać:
error[E0631]: type mismatch in closure arguments
--> src/main.rs:6:21
|
5 | let mut insert = |k| seq.insert(k);
| ----------------- found signature of `fn(_) -> _`
6 | (1..10).cycle().take_while(insert);
| ^^^^^^^^^^ expected signature of `for<'r> fn(&'r {integer}) -> _`
error[E0271]: type mismatch resolving `for<'r> <[[email protected]/main.rs:5:22: 5:39 seq:_] as std::ops::FnOnce<(&'r {integer},)>>::Output == bool`
--> src/main.rs:6:21
|
6 | (1..10).cycle().take_while(insert);
| ^^^^^^^^^^ expected bound lifetime parameter, found concrete lifetime
Jak muszę zmienić kod na to, aby praca?
ciekawy, to działa, jeśli zamknięcie jest przenoszony bezpośrednio do 'rozmowy take_while': http://is.gd/OgVK2i –
@ker, to działa, bo robisz subtelnie inna sprawa - używasz niejawnego dereferencji we wzorcu, który oryginalny kod nie. –