РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
644 of 1245 menu

Метод 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,
    который собирает элементы итератора в коллекцию
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить