查看: 17|回覆: 0

rust之map和filter初探。

[複製鏈接]

3

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2011-7-10
發表於 2025-4-2 00:00:00 | 顯示全部樓層 |閲讀模式
点击查看代码
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,他是双层引用,标准库没有定义双层引用的运算符。

来源:https://www.cnblogs.com/more-sleep/p/18805228
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部