当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust Iterator.fold用法及代码示例


本文简要介绍rust语言中 std::iter::Iterator.fold 的用法。

用法

fn fold<B, F>(self, init: B, f: F) -> B where    F: FnMut(B, Self::Item) -> B,

通过应用操作将每个元素折叠成一个累加器,返回最终结果。

fold() 接受两个参数:一个初始值和一个带有两个参数的闭包:一个 'accumulator' 和一个元素。闭包返回累加器下一次迭代应具有的值。

初始值是累加器在第一次调用时将具有的值。

将此闭包应用于迭代器的每个元素后,fold() 返回累加器。

此操作有时称为'reduce' 或'inject'。

每当你有一些东西的集合并想从中产生一个值时,折叠很有用。

注意: fold() 以及遍历整个迭代器的类似方法可能不会因无限迭代器而终止,即使对于可在有限时间内确定结果的特征也是如此。

注意:如果累加器类型和项类型相同,则 reduce() 可用于使用第一个元素作为初始值。

注意:fold()将元素组合在一个left-associative时尚。对于像这样的结合运算符+,元素组合的顺序并不重要,但对于非关联运算符,如-顺序会影响最终结果。为一个right-associative版本fold(), 看std::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大神的英文原创作品 std::iter::Iterator.fold。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。