Современные языки программирования не стоят на месте и постоянно предлагают новые фичи, которые делают нашу жизнь проще и код чище. Однако некоторые из них настолько естественны и удобны, что мы даже не замечаем их значимости, пока не попробуем без них обойтись. Одной из таких незаметных, но крайне важных вещей стала конвейерная обработка данных — или pipelining. Конвейерная обработка (или pipelining) — это подход к написанию кода, при котором данные последовательно проходят через набор операций, трансформируясь и фильтруясь по пути. В большинстве случаев выглядит это так: fn get_ids(data: Vec<Widget>) -> Vec<Id> {
data.iter()
.filter(|w| w.alive)
.map(|w| w.id)
.collect()
} На первый взгляд, ничего необычного, но попробуйте представить аналогичный код без pipelining’а: fn get_ids(data: Vec<Widget>) -> Vec<Id> {
collect(map(filter(iter(data), |w| w.alive), |w| w.id))
} Второй вариант кажется запутанным и сложно читаемым, верно? В этом вся магия pipelinin