rust的collect, fold函数

Posted chenguifeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rust的collect, fold函数相关的知识,希望对你有一定的参考价值。

collect

技术图片

 

 nth函数

技术图片

 

 

let a = [1, 2, 3];

let mut iter = a.iter();

assert_eq!(iter.nth(1), Some(&2));
assert_eq!(iter.nth(1), None);
let a = [1, 2, 3];
assert_eq!(a.iter().nth(10), None);

 

fold

fold(base, |accumulator, element| .. )
let m = (1..20).fold(1u64, |mul, x| mul*x);

需要注意的是,fold的输出结果的类型,最终是和base的类型是一致的(如果base的类型没指定,那么可以根据前面m的类型进行反推,除非m的类型也未指定),也就是说,一旦我们将上面代码中的base从 1u64 改成 1,那么这行代码最终将会因为数据溢出而崩溃!

技术图片

let a = [0i32, 1, 2];

let mut iter = a.iter().filter(|x| x.is_positive());

assert_eq!(iter.next(), Some(&1));
assert_eq!(iter.next(), Some(&2));
assert_eq!(iter.next(), None);

技术图片

 

 技术图片

 

 take(n)的作用是取前n个元素,而skip(n)正好相反,跳过前n个元素

zip

技术图片

 

 

let v = vec![1u64, 2, 3, 4, 5, 6];
let val = v.iter()
    .enumerate()
    // 迭代生成标,并且每两个元素剔除一个
    .filter(|&(idx, _)| idx % 2 == 0)
    // 将下标去除,如果调用unzip获得最后结果的话,可以调用下面这句,终止链式调用
    // .unzip::<_,_, vec<_>, vec<_>>().1
    .map(|(idx, val)| val)
    // 累加 1+3+5 = 9
    .fold(0u64, |sum, acm| sum + acm);
println!("{}", val);
let a = [1, 2, 3];

let mut iter = a.iter().map(|x| 2 * x);

assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next(), Some(4));
assert_eq!(iter.next(), Some(6));
assert_eq!(iter.next(), None);

 

以上是关于rust的collect, fold函数的主要内容,如果未能解决你的问题,请参考以下文章

Rust - 创建过滤谓词作为函数

金蝶handler中 collection 代码片段理解

如何使我的 Rust 函数更通用和高效?

23.Rust-集合(Collections)

为啥下面的代码不能得到 n fold = 1 的值?

rust实战系列