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


Rust Iterator.fold用法及代碼示例


本文簡要介紹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);

讓我們在這裏遍曆迭代的每個步驟:

元素accx結果
0
1011
2123
3336

因此,我們的最終結果 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-lang.org大神的英文原創作品 core::iter::Iterator.fold。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。