Метод try_fold
Метод try_fold выполняет свёртку элементов итератора
в один результат, но в отличие от обычного fold
позволяет прервать процесс при возникновении ошибки.
Метод принимает начальное значение аккумулятора и замыкание,
которое получает аккумулятор и очередной элемент итератора.
Замыкание должно возвращать Result: вариант Ok
с новым значением аккумулятора или Err с ошибкой.
Если замыкание вернуло Err, итерация немедленно
прекращается, и метод возвращает эту ошибку. Если все элементы
обработаны успешно, возвращается Ok с итоговым
аккумулятором.
Синтаксис
iterator.try_fold(init, |acc, item| -> Result<_, E> { ... })
Пример
Давайте сложим все числа вектора, но прервёмся,
если встретится число больше 3. Для этого вернём Err
при обнаружении такого числа:
fn main()
{
let nums = vec![1, 2, 3, 4, 5];
let res: Result<i32, &str> = nums.iter().try_fold(0, |acc, &x| {
if x > 3 {
Err("number too big")
} else {
Ok(acc + x)
}
});
println!("{:?}", res);
}
Результат выполнения кода:
Err("number too big")
Пример
Давайте выполним свёртку без ошибок, чтобы увидеть успешный результат. Возьмём числа от 1 до 3:
fn main()
{
let nums = vec![1, 2, 3];
let res: Result<i32, &str> = nums.iter().try_fold(0, |acc, &x| {
if x > 3 {
Err("number too big")
} else {
Ok(acc + x)
}
});
println!("{:?}", res);
}
Результат выполнения кода:
Ok(6)
Пример
Давайте используем try_fold для конкатенации строк
с проверкой длины. Если длина промежуточной строки превышает
5 символов, вернём ошибку:
fn main()
{
let words = vec!["ab", "cd", "ef", "gh"];
let res: Result<String, &str> = words.iter().try_fold(String::new(), |acc, &word| {
let new_acc = acc + word;
if new_acc.len() > 5 {
Err("string too long")
} else {
Ok(new_acc)
}
});
println!("{:?}", res);
}
Результат выполнения кода:
Err("string too long")
Смотрите также
-
метод
fold,
который выполняет свёртку без возможности прерывания -
метод
try_for_each,
который применяет функцию к каждому элементу с возможностью ошибки -
метод
reduce,
который сворачивает итератор без начального значения -
метод
collect,
который собирает элементы итератора в коллекцию