本文简要介绍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);
让我们在这里遍历迭代的每个步骤:
元素 | 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.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 Iterator.inspect用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 std::iter::Iterator.fold。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。