马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
点击查看代码- 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,他是双层引用,标准库没有定义双层引用的运算符。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |