本文簡要介紹rust語言中 core::iter::Iterator.fold
的用法。
用法
fn fold<B, F>(self, init: B, f: F) -> B where Self: Sized, F: FnMut(B, Self::Item) -> B,
通過應用操作將每個元素折疊成一個累加器,返回最終結果。
fold()
接受兩個參數:一個初始值和一個帶有兩個參數的閉包:一個 'accumulator' 和一個元素。閉包返回累加器下一次迭代應具有的值。
初始值是累加器在第一次調用時將具有的值。
將此閉包應用於迭代器的每個元素後,fold()
返回累加器。
此操作有時稱為'reduce' 或'inject'。
每當你有一些東西的集合並想從中產生一個值時,折疊很有用。
注意: fold()
以及遍曆整個迭代器的類似方法可能不會因無限迭代器而終止,即使對於可在有限時間內確定結果的特征也是如此。
注意:如果累加器類型和項類型相同,則 reduce()
可用於使用第一個元素作為初始值。
注意:fold()
將元素組合在一個left-associative時尚。對於像這樣的結合運算符+
,元素組合的順序並不重要,但對於非關聯運算符,如-
順序會影響最終結果。為一個right-associative版本fold()
, 看core::iter::DoubleEndedIterator.rfold.
給實施者的注意事項
就這一方法而言,其他幾個(前向)方法具有默認實現,因此如果它可以比默認的for
循環實現做得更好,請嘗試顯式實現它。
特別是,嘗試在組成此迭代器的內部部件上調用 fold()
。
例子
基本用法:
let a = [1, 2, 3];
// the sum of all of the elements of the array
let sum = a.iter().fold(0, |acc, x| acc + x);
assert_eq!(sum, 6);
讓我們在這裏遍曆迭代的每個步驟:
元素 | acc | x | 結果 |
---|---|---|---|
0 | |||
1 | 0 | 1 | 1 |
2 | 1 | 2 | 3 |
3 | 3 | 3 | 6 |
因此,我們的最終結果 6
。
這個例子演示了 fold()
的 left-associative 性質:它構建一個字符串,從一個初始值開始,從前麵到後麵繼續每個元素:
let numbers = [1, 2, 3, 4, 5];
let zero = "0".to_string();
let result = numbers.iter().fold(zero, |acc, &x| {
format!("({} + {})", acc, x)
});
assert_eq!(result, "(((((0 + 1) + 2) + 3) + 4) + 5)");
對於沒有經常使用迭代器的人來說,使用帶有事物列表的for
循環來構建結果是很常見的。這些可以變成 fold()
s:
let numbers = [1, 2, 3, 4, 5];
let mut result = 0;
// for loop:
for i in &numbers {
result = result + i;
}
// fold:
let result2 = numbers.iter().fold(0, |acc, &x| acc + x);
// they're the same
assert_eq!(result, result2);
相關用法
- Rust Iterator.fold用法及代碼示例
- Rust Iterator.for_each用法及代碼示例
- Rust Iterator.find_map用法及代碼示例
- Rust Iterator.flat_map用法及代碼示例
- Rust Iterator.fuse用法及代碼示例
- Rust Iterator.flatten用法及代碼示例
- Rust Iterator.find用法及代碼示例
- Rust Iterator.filter用法及代碼示例
- Rust Iterator.filter_map用法及代碼示例
- 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.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-lang.org大神的英文原創作品 core::iter::Iterator.fold。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。