rust之map和filter初探。

打印 上一主题 下一主题

主题 1740|帖子 1740|积分 5220

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
点击查看代码
  1. fn main() {
  2.     let v = vec![1, 2, 3, 4];
  3.     let a: Vec<_> = v.iter().filter(|x: &&i32| *x % 2 == 0).map(|x: &i32| x * 2).collect();
  4.     let b: Vec<_> = v.iter().map(|x: &i32| x * 2).filter(|x: &i32| x % 2 == 0).collect();
  5.     println!("{} {}", a[0], b[0]);
  6. }
复制代码
以上代码是rust圣经的习题代码,可编译通过,习题聚焦于为何`filter(|x: &&i32| *x % 2 == 0)`此处多出俩&&。map的设计哲学是由原来的iter映射出新的iter,故不必要给闭包传递引用,直接传值。其返回值由闭包决定。filter的设计哲学是过滤原生数组,不新增实体,故给闭包传递引用。其返回值由原输入iter决定。再来看iter(),这个东西会天生引用`Iterator`。最后是几个运算符号,*,%,这种基础运算符,标准库里为他们定义了对引用和值的运算,也就是说不必先对单层引用解引用,可以直接用单层引用进行运算。所以唯一必要解引用的地方就是第一个filter,他是双层引用,标准库没有定义双层引用的运算符。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表