當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust Iterator.try_fold用法及代碼示例


本文簡要介紹rust語言中 core::iter::Iterator.try_fold 的用法。

用法

fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R where    Self: Sized,    F: FnMut(B, Self::Item) -> R,    R: Try<Output = B>,

一個迭代器方法,隻要函數成功返回,它就會應用一個函數,產生一個單一的最終值。

try_fold() 接受兩個參數:一個初始值和一個帶有兩個參數的閉包:一個 'accumulator' 和一個元素。閉包或者成功返回,並返回累加器下一次迭代應具有的值,或者返回失敗,並立即將錯誤值傳播回調用者(短路)。

初始值是累加器在第一次調用時將具有的值。如果對迭代器的每個元素應用閉包成功,try_fold() 將最終累加器返回為成功。

每當你有一些東西的集合並想從中產生一個值時,折疊很有用。

給實施者的注意事項

就這一方法而言,其他幾個(前向)方法具有默認實現,因此如果它可以比默認的for 循環實現做得更好,請嘗試顯式實現它。

特別是,嘗試在組成此迭代器的內部部件上調用 try_fold()。如果需要多次調用,? 運算符可能便於將累加器值鏈接起來,但要注意在早期返回之前需要維護的任何不變量。這是&mut self 方法,因此在此處遇到錯誤後需要可恢複迭代。

例子

基本用法:

let a = [1, 2, 3];

// the checked sum of all of the elements of the array
let sum = a.iter().try_fold(0i8, |acc, &x| acc.checked_add(x));

assert_eq!(sum, Some(6));

短路:

let a = [10, 20, 30, 100, 40, 50];
let mut it = a.iter();

// This sum overflows when adding the 100 element
let sum = it.try_fold(0i8, |acc, &x| acc.checked_add(x));
assert_eq!(sum, None);

// Because it short-circuited, the remaining elements are still
// available through the iterator.
assert_eq!(it.len(), 2);
assert_eq!(it.next(), Some(&40));

雖然你不能從閉包中break,但 ControlFlow 類型允許類似的想法:

use std::ops::ControlFlow;

let triangular = (1..30).try_fold(0_i8, |prev, x| {
    if let Some(next) = prev.checked_add(x) {
        ControlFlow::Continue(next)
    } else {
        ControlFlow::Break(prev)
    }
});
assert_eq!(triangular, ControlFlow::Break(120));

let triangular = (1..30).try_fold(0_u64, |prev, x| {
    if let Some(next) = prev.checked_add(x) {
        ControlFlow::Continue(next)
    } else {
        ControlFlow::Break(prev)
    }
});
assert_eq!(triangular, ControlFlow::Continue(435));

相關用法


注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 core::iter::Iterator.try_fold。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。