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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM