Метод map_while
Метод map_while создает новый итератор, который применяет
заданную функцию к каждому элементу исходного итератора.
В отличие от обычного map, который продолжает работу
до конца итератора, map_while останавливается, как только
функция возвращает None. Параметром метод принимает
замыкание, которое возвращает Option.
Синтаксис
iter.map_while(f)
Пример
Давайте возьмем числа от 1 до 10 и остановимся, когда число
станет больше 5. Функция будет возвращать Some, пока
условие выполняется, и None, когда число превысит 5:
fn main()
{
let iter = 1..=10;
let res: Vec<i32> = iter.map_while(|x| {
if x <= 5 {
Some(x)
} else {
None
}
}).collect();
println!("{:?}", res);
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Пример
Давайте обработаем строки, пока длина строки не станет равной 3 символам. Как только встретится строка длиной 3, итерация прекратится:
fn main()
{
let vec = vec!["a", "ab", "abc", "abcd", "abcde"];
let iter = vec.iter();
let res: Vec<&str> = iter.map_while(|s| {
if s.len() < 3 {
Some(*s)
} else {
None
}
}).collect();
println!("{:?}", res);
}
Результат выполнения кода:
["a", "ab"]
Пример
Давайте используем map_while для парсинга чисел из строк.
Если строка не является числом, возвращаем None и
останавливаем итерацию:
fn main()
{
let vec = vec!["1", "2", "3", "abc", "4", "5"];
let iter = vec.iter();
let res: Vec<i32> = iter.map_while(|s| {
s.parse::<i32>().ok()
}).collect();
println!("{:?}", res);
}
Результат выполнения кода:
[1, 2, 3]
Смотрите также
-
метод
map,
который преобразует каждый элемент итератора -
метод
take_while,
который берет элементы, пока предикат истинен -
метод
skip_while,
который пропускает элементы, пока предикат истинен -
метод
filter_map,
который фильтрует и преобразует элементы одновременно