为什么“take_while”的闭包通过引用获取其参数?

qed*_*qed 5 closures higher-order-functions rust

这是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);
}
Run Code Online (Sandbox Code Playgroud)

为什么 for 的闭包take_while通过引用获取其参数,而所有其他闭包则通过值获取其参数?

She*_*ter 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
            }
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

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