Chciałbym użyć Peekable
jako podstawę dla nowego cautious_take_while
operacji, która działa jak take_while
od IteratorExt
ale bez spożywania pierwszej nieudanej element. (Istnieje boczne pytanie, czy jest to dobry pomysł i czy istnieją lepsze sposoby osiągnięcia tego celu w Rust - byłbym szczęśliwy z powodu wskazówek w tym kierunku, ale głównie staram się zrozumieć, gdzie jest mój kod łamanie).Wdrażanie „ostrożny” take_while użyciu Peekable
API Próbuję włączyć to w zasadzie:
let mut chars = "abcdefg.".chars().peekable();
let abc : String = chars.by_ref().cautious_take_while(|&x| x != 'd');
let defg : String = chars.by_ref().cautious_take_while(|&x| x != '.');
// yielding (abc = "abc", defg = "defg")
Wziąłem pęknięcia na creating a MCVE here, ale ja dostaję:
:10:5: 10:19 error: cannot move out of borrowed content :10 chars.by_ref().cautious_take_while(|&x| x != '.');
O ile mogę powiedzieć Podążam za tym samym wzorem co Rusta TakeWhile
pod względem moich sygnatur funkcji, ale widzę różne zachowanie od kontrolera pożyczek. Czy ktoś może wskazać, co robię źle?
Dzięki @rodrigo! Włączyłem twoją pierwszą sugestię, aby stworzyć przykład pracy pod adresem http://is.gd/NalTYL. Ale kiedy próbuję wprowadzić piszę do struktury, jak w http://is.gd/6c64vf, otrzymuję komunikat 'error: the trait * core :: clone :: Clone * nie jest zaimplementowany dla jądra typu * i mut: : iter :: Peekable * ', którego nie mogę pokonać poprzez dodanie' + Clone' do granic cech w linii 43. –
Bosh
@Bosh. Nie jestem pewien, ale myślę, że zmiennego wskaźnika nie można sklonować. Twój wariant akceptuje 'Clone' prawdopodobnie dlatego, że' Peekable' insynuuje '' Clone' jawnie. Może możesz zrobić to samo, ale kod będzie wymagał refaktoryzacji ... – rodrigo
Świetnie. Przestałem czerpać z 'Clone' i czyściłem linie czasu: http://is.gd/ljjJAE. Jeszcze raz dziękuję za pomoc + wyjaśnienia! – Bosh