本文簡要介紹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 Iterator.try_fold用法及代碼示例
- Rust Iterator.try_for_each用法及代碼示例
- Rust Iterator.try_find用法及代碼示例
- Rust Iterator.take_while用法及代碼示例
- Rust Iterator.take用法及代碼示例
- Rust Iterator.skip_while用法及代碼示例
- Rust Iterator.max_by_key用法及代碼示例
- Rust Iterator.is_sorted用法及代碼示例
- Rust Iterator.cmp用法及代碼示例
- Rust Iterator.is_partitioned用法及代碼示例
- Rust Iterator.intersperse用法及代碼示例
- Rust Iterator.scan用法及代碼示例
- Rust Iterator.min用法及代碼示例
- Rust Iterator.find_map用法及代碼示例
- Rust Iterator.peekable用法及代碼示例
- Rust Iterator.rev用法及代碼示例
- Rust Iterator.product用法及代碼示例
- Rust Iterator.any用法及代碼示例
- Rust Iterator.max用法及代碼示例
- Rust Iterator.by_ref用法及代碼示例
- Rust Iterator.min_by用法及代碼示例
- Rust Iterator.copied用法及代碼示例
- Rust Iterator.inspect用法及代碼示例
- Rust Iterator.min_by_key用法及代碼示例
- Rust Iterator.intersperse_with用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 core::iter::Iterator.try_fold。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。