查看: 101|回复: 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:dzh188@hotmail.com

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

在本版发帖返回顶部