Pro zajímavost, v Rustu se to dělá idiomaticky bez korutin i bez implementace vlastního iterátoru. Když už mám iterátor, a chci z něj jen vyfiltrovat některé položky, použiju prostě metodu filter, která vrací jiný iterátor. Ten má v sobě zabalený ten původní a predikát, při iteraci přeskakuje nevyhovující.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=c93f0ee782a56a5e475f6e26c95229f3
fn filter_files(iter: impl Iterator<Item=String>) -> impl Iterator<Item=String> {
iter.filter(|item| item.starts_with("Soubor"))
}
fn main() {
let v = vec!["Soubor XXX".to_string(), "Adresar YYY".to_string()];
for s in filter_files(v.into_iter()) {
println!("{}", s)
}
}
vypíše Soubor XXX.
Hej implementovať vlastný iterátor nemusíte, lebo ho už pred vami implemetovali programátri rustovského ekosystému. filter vracia špeciálny iterátor s názvom
Filter a ten je natoľko obecný (keďže obsahuje predikát) že sa dá použiť všade kde sa niečo filtruje, aspoň teda ak správne čítam zdroják:
url=https://doc.rust-lang.org/nightly/src/core/iter/adapters/filter.rs.html
Podobne to funguje aj v LINQ (v C# a F#) cca 15 rokov:
Seq.filter a (F#)
Enumerable.Where (C#) vracaju WhereEnumerableIterator a WhereIterator. Tu je zdroják... funkcia
filter Where je hneď na začiatku:
Edit: nie filter ale Where pletie sa mi to lebo Seq.filter je vlastne alias pre Enumerable.Where a Seq.map je niečo ako alias pre Enumerable.Selecthttps://referencesource.microsoft.com/#system.core/system/linq/Enumerable.csMimochodom aj v java to má podobne (odkedy tam pridali streamy)
Aj STL či boost má funkcie z rovnakého súdka napr std::copy_if je náhrada za filter a std::transform náhrada za map etc aj keď iterárátormi sa tam pracuje o niečo krkolomnejšie používajú sa tam insertery a podobne, ale zase sa to dá aj viac customizovať. Ja som pre C++ hľadal niečo viac sexy, čo funguje podobne ako váš príklad z Rustu. Akurát C++ je veľmi konzervatívny jazyk, ktorý pridáva nové vlastnosti pomaly a to až vtedy keď su poriadne odstestované naprieč ostatnými jazykmi. Nepozerá až tak veľmi na sexy zápis, ale skôr performance. A keď sa tam má dostať nejaká nová vlastnosť tak až vtedy keď sa navrhne nejaká veľmi efektívna a dokonale customizovateľná univerzálna implemetácia.
Ale inak ďakujem za vysvetlenie

Rust je jeden z jazykov, ktorý má do budúcna potenciál možno raz aj nahradiť C/C++