Я читал главу о функциях Rust высшего порядка на примере . Где они представляют следующий канонический пример:
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. Похоже, что здесь происходит какое-то сопоставление / деструктурирование шаблонов, но я не смог найти соответствующую документацию.