2014-05-03 29 views
3

我有一些很难理解在这个例子中的区别:为什么ITER()要求及对lambda函数,而范围在这个例子不

我认为两者range(..)iter()std::iter::Iterator 那么,为什么我在第一个示例中将|x|传递给mapfilter,但必须在第二个示例中将其作为|&x|传递给它?

use std::iter::AdditiveIterator; 

fn main() { 
    let range1 = range(1,9); 
    let range2 = [1,2,3,4,5,6,7,8,9]; 

    //indented for easier visualization 
    let sum1 = range1  .map(| x| x * x).filter(| x| x % 2 == 0).sum(); 
    let sum2 = range2.iter().map(|&x| x * x).filter(|&x| x % 2 == 0).sum(); 

    println!("{}", sum1); 
    println!("{}", sum2); 
} 
+0

'filter'调用中不应该有'&':'map'部分之后,你正在处理'int'而不是'&int'。 –

+0

@ChrisMorgan,no,'filter'接收对项目的引用,而不是项目本身。 – huon

回答

5

只知道他们都是Iterator不知道Iterator S型参数不告诉你他们是迭代的东西,这是这里最重要的区别什么。对于此代码:

  • range1Iterator<int>
  • range2.iter()Iterator<&int>

也就是说,slice iterator返回引用直接指向片(它必须这么做,否则,一般T,它会试图窃取所借的分片&[T]中的所有权:非法),而range只是按值返回计数器,因为它在内部构造它,并且可以自由地将其分发(“转让所有权”)。

因此,为了从片迭代器中获得int,您需要以某种方式取消引用,例如,通过|&x| ...或通过编写|x| *x * *x通过它进行模式匹配。

相关问题