Метод try_for_each
Метод try_for_each применяет заданную функцию
к каждому элементу итератора. В отличие от метода
for_each, функция должна возвращать тип
Result. Если очередной вызов возвращает
Err, итерация немедленно прекращается, и метод
возвращает эту ошибку. Если все вызовы успешны, метод
возвращает Ok(()). Параметром метод принимает
замыкание, которому передаётся текущий элемент итератора,
а возвращается значение типа Result.
Синтаксис
iter.try_for_each(f)
Пример
Давайте применим метод try_for_each к вектору
чисел, где каждый элемент преобразуется в строку, если
он положительный:
fn main()
{
let res: Result<(), String> = vec![1, 2, 3, 4, 5]
.iter()
.try_for_each(|x| {
if *x > 0 {
println!("{}", x);
Ok(())
} else {
Err(format!("Negative: {}", x))
}
});
println!("{:?}", res);
}
Результат выполнения кода:
1
2
3
4
5
Ok(())
Пример
Теперь рассмотрим случай, когда встречается элемент, вызывающий ошибку, и итерация прерывается:
fn main()
{
let res: Result<(), String> = vec![1, 2, -3, 4, 5]
.iter()
.try_for_each(|x| {
if *x > 0 {
println!("{}", x);
Ok(())
} else {
Err(format!("Negative: {}", x))
}
});
println!("{:?}", res);
}
Результат выполнения кода:
1
2
Err("Negative: -3")
Как видно, элементы 4 и 5
не были обработаны, так как итерация остановилась
на элементе -3.
Пример
Давайте используем метод try_for_each для
работы со строками, где проверяется, что все строки
не пустые:
fn main()
{
let res: Result<(), String> = vec!["abcde", "12345", "xyz"]
.iter()
.try_for_each(|s| {
if !s.is_empty() {
println!("{}", s);
Ok(())
} else {
Err("Empty string found".to_string())
}
});
println!("{:?}", res);
}
Результат выполнения кода:
abcde
12345
xyz
Ok(())
Смотрите также
-
метод
for_each,
который применяет функцию к каждому элементу без остановки -
метод
try_fold,
который сворачивает итератор с возможностью ошибки -
метод
collect,
который собирает элементы итератора в коллекцию -
метод
filter_map,
который фильтрует и преобразует элементы одновременно