Понимание объявления типа параметра функции Rust - PullRequest
1 голос
/ 08 марта 2019

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

1 Ответ

5 голосов
/ 08 марта 2019

Вы используете Деструктурирование функционального параметра :

|&n_squared| n_squared < upper

функционально эквивалентно:

|n_squared| *n_squared < upper

Чтобы лучше это понять, представьте, что вы передаетекортеж типа & (i32, i32) в лямбду:

|&(x, y) : &(i32, i32)| x + y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...