为什么`take_while`的闭包需要通过引用传递其参数?

5

以下是来自Rust by Example的示例:

fn is_odd(n: u32) -> bool {
    n % 2 == 1
}

fn main() {
    println!("Find the sum of all the squared odd numbers under 1000");
    let upper = 1000;

    // Functional approach
    let sum_of_squared_odd_numbers: u32 =
        (0..).map(|n| n * n)             // All natural numbers squared
             .take_while(|&n| n < upper) // Below upper limit
             .filter(|n| is_odd(*n))     // That are odd
             .fold(0, |sum, i| sum + i); // Sum them
    println!("functional style: {}", sum_of_squared_odd_numbers);
}

为什么 take_while 的闭包使用引用传递其参数,而其他所有闭包都是按值传递?

2
take_while和filter都接收一个引用。在这个例子中,take_while使用|&n|解构引用,而filter使用*n解除引用。 - A.B.
1个回答

4

Iterator::take_while 的实现非常有启发性:

fn next(&mut self) -> Option<I::Item> {
    if self.flag {
        None
    } else {
        self.iter.next().and_then(|x| {
            if (self.predicate)(&x) {
                Some(x)
            } else {
                self.flag = true;
                None
            }
        })
    }
}

如果从底层迭代器返回的值被直接传递给谓词,那么对该值的所有权也将转移。在调用谓词之后,如果谓词为真,则TakeWhile适配器中将不再有可返回的值!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接