我正在阅读chapter on higher order functions of Rust by Example。他们在下面展示了以下典型示例:
fn is_odd(n: u32) -> bool {
n % 2 == 1
}
fn main() {
let upper = 1000;
println!("imperative style: {}", acc);
let sum_of_squared_odd_numbers: u32 =
(0..).map(|n| n * n) // All natural numbers squared
.take_while(|&n_squared| n_squared < upper) // Below upper limit
.filter(|&n_squared| is_odd(n_squared)) // That are odd
.fold(0, |acc, n_squared| acc + n_squared); // Sum them
}
足够简单。但是我意识到我不理解参数n_squared
的类型。 take_while
和filter
都接受一个通过引用获取参数的函数。这对我来说很有意义,您想借用而不是消耗地图中的值。
但是,如果n_squared
是一个引用,为什么在比较其值以限制或令人惊讶之前,我不必取消引用呢?为什么我可以直接将它传递给is_odd()而不取消引用?
即为什么不呢?
|&n_squared| *n_squared < upper
当我尝试编译器给出以下错误时:
error[E0614]: type `{integer}` cannot be dereferenced
--> src\higherorder.rs:13:34
|
13 | .take_while(|&n_squared| *n_squared <= upper)
|
指示n_squared
是i32,而不是&i32。看起来这里正在发生某种排序模式匹配/解构,但是我找不到相关文档。
答案 0 :(得分:5)
您正在使用function parameter destructuring:
|&n_squared| n_squared < upper
在功能上等同于:
|n_squared| *n_squared < upper
要更好地理解这一点,假设您正在将&(i32,i32)类型的元组传递给lambda:
|&(x, y) : &(i32, i32)| x + y