Использование замыканий, которые захватывают свою среду
Многие адаптеры итератора принимают замыкания в качестве аргументов, и обычно замыкания, которые мы будем указывать в качестве аргументов для адаптеров итератора, будут замыканиями, которые захватывают свою среду.
Для примера мы будем использовать метод filter
, который принимает замыкание. Замыкание получает элемент из итератора и возвращает bool
. Если замыкание возвращает true
, значение будет включено в итерацию, созданную методом filter
. Если замыкание возвращает false
, значение не будет включено.
В Listing 13-16 мы используем filter
с замыканием, которое захватывает переменную shoe_size
из своей среды, чтобы перебрать коллекцию экземпляров структуры Shoe
. Метод вернет только туфли указанного размера.
Filename: src/lib.rs
#[derive(PartialEq, Debug)]
struct Shoe {
size: u32,
style: String,
}
fn shoes_in_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> {
shoes.into_iter().filter(|s| s.size == shoe_size).collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn filters_by_size() {
let shoes = vec![
Shoe {
size: 10,
style: String::from("sneaker"),
},
Shoe {
size: 13,
style: String::from("sandal"),
},
Shoe {
size: 10,
style: String::from("boot"),
},
];
let in_my_size = shoes_in_size(shoes, 10);
assert_eq!(
in_my_size,
vec![
Shoe {
size: 10,
style: String::from("sneaker")
},
Shoe {
size: 10,
style: String::from("boot")
},
]
);
}
}
Listing 13-16: Использование метода filter
с замыканием, которое захватывает shoe_size
Функция shoes_in_size
получает владение за вектором туфель и размером туфли в качестве параметров. Она возвращает вектор, содержащий только туфли указанного размера.
В теле функции shoes_in_size
мы вызываем into_iter
, чтобы создать итератор, который получает владение за вектором. Затем мы вызываем filter
, чтобы адаптировать этот итератор в новый итератор, который содержит только элементы, для которых замыкание возвращает true
.
Замыкание захватывает параметр shoe_size
из среды и сравнивает значение с размером каждой из туфель, оставляя только туфли указанного размера. Наконец, вызов collect
собирает значения, возвращаемые адаптированным итератором, в вектор, который возвращается функцией.
Тест показывает, что при вызове shoes_in_size
мы получаем только туфли того же размера, что и значение, которое мы указали.