找回密码
 立即注册
首页 资源区 代码 rust之map和filter初探。

rust之map和filter初探。

吕清莹 前天 15:20
点击查看代码
  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,他是双层引用,标准库没有定义双层引用的运算符。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册