Как диапазон может быть использован в Vec? - PullRequest
0 голосов
/ 06 октября 2018

Этот код работает нормально:

fn main() {
    let v: i32 = vec![1, 2, 3, 4, 5].iter().map(|&x: &i32| x.pow(2)).sum();
    println!("{}", v);
}

Я пытался заменить vec![1, 2, 3, 4, 5] на vec![1..5], но iter и map не работали:

error[E0631]: type mismatch in closure arguments
 --> src/main.rs:2:36
  |
2 |     let v: i32 = vec![1..5].iter().map(|&x: &i32| x.pow(2)).sum();
  |                                    ^^^ ------------------- found signature of `for<'r> fn(&'r i32) -> _`
  |                                    |
  |                                    expected signature of `fn(&std::ops::Range<{integer}>) -> _`

error[E0599]: no method named `sum` found for type `std::iter::Map<std::slice::Iter<'_, std::ops::Range<{integer}>>, [closure@src/main.rs:2:40: 2:59]>` in the current scope
 --> src/main.rs:2:61
  |
2 |     let v: i32 = vec![1..5].iter().map(|&x: &i32| x.pow(2)).sum();
  |                                                             ^^^
  |
  = note: the method `sum` exists but the following trait bounds were not satisfied:
          `std::iter::Map<std::slice::Iter<'_, std::ops::Range<{integer}>>, [closure@src/main.rs:2:40: 2:59]> : std::iter::Iterator`
          `&mut std::iter::Map<std::slice::Iter<'_, std::ops::Range<{integer}>>, [closure@src/main.rs:2:40: 2:59]> : std::iter::Iterator`

Я также задал этот вопрос на форуме пользователя Rust .

1 Ответ

0 голосов
/ 06 октября 2018

Диапазон, такой как 1..5, уже является итератором, поэтому вам не нужно вызывать iter(), чтобы создать его:

let v: i32 = (1..5).map(|x: i32| x.pow(2)).sum();

Также обратите внимание, что ссылки пропали, потому что этот итератор выполняет итерации по значениям.

Если вам абсолютно необходим Vec, вам нужно сначала собрать в него диапазон:

let v: i32 = (1..5)
    .collect::<Vec<i32>>()
    .iter()
    .map(|&x: &i32| x.pow(2))
    .sum();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...