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);

猜你喜欢

转载自www.cnblogs.com/chenguifeng/p/12243999.html