動態

詳情 返回 返回

rust之map和filter初探。 - 動態 詳情

點擊查看代碼
fn main() {
    let v = vec![1, 2, 3, 4];
    let a: Vec<_> = v.iter().filter(|x: &&i32| *x % 2 == 0).map(|x: &i32| x * 2).collect();
    let b: Vec<_> = v.iter().map(|x: &i32| x * 2).filter(|x: &i32| x % 2 == 0).collect();
    println!("{} {}", a[0], b[0]);
}
以上代碼是rust聖經的習題代碼,可編譯通過,習題聚焦於為何`filter(|x: &&i32| *x % 2 == 0)`此處多出倆&&。 map的設計哲學是由原來的iter映射出新的iter,故不需要給閉包傳遞引用,直接傳值。其返回值由閉包決定。 filter的設計哲學是過濾原生數組,不新增實體,故給閉包傳遞引用。其返回值由原輸入iter決定。 再來看iter(),這個東西會生成引用`Iterator`。 最後是幾個運算符號,*,%,這種基礎運算符,標準庫裏為他們定義了對引用和值的運算,也就是説不必先對單層引用解引用,可以直接用單層引用進行運算。 所以唯一需要解引用的地方就是第一個filter,他是雙層引用,標準庫沒有定義雙層引用的運算符。

Add a new 評論

Some HTML is okay.