如何从 `Iterator<Item=&i32>` 构建 `Vec<i32>`?

Nyx*_*nyx 5 iterator reference ownership rust

当我尝试使用函数通过引用而不是值传递来get_even_numbers()借用 vec时,我遇到了错误。v&vv

fn get_even_numbers(v: &Vec<i32>) -> Vec<i32> {
    v.iter().filter(|x| x % 2 == 0).collect()
}

fn main() {
    let v: Vec<i32> = (0..10).collect();
    let even: Vec<i32> = get_even_numbers(&v);
    println!("Even numbers: {:?}", even);
}
Run Code Online (Sandbox Code Playgroud)
fn get_even_numbers(v: &Vec<i32>) -> Vec<i32> {
    v.iter().filter(|x| x % 2 == 0).collect()
}

fn main() {
    let v: Vec<i32> = (0..10).collect();
    let even: Vec<i32> = get_even_numbers(&v);
    println!("Even numbers: {:?}", even);
}
Run Code Online (Sandbox Code Playgroud)

为什么上面会报错,而按值传入却不会报错,如下所示?

fn get_even_numbers(v: Vec<i32>) -> Vec<i32> {
    v.into_iter().filter(|x| x % 2 == 0).collect()
}

fn main() {
    let v: Vec<i32> = (0..10).collect();
    let even: Vec<i32> = get_even_numbers(v);
    println!("Even numbers: {:?}", even);
}
Run Code Online (Sandbox Code Playgroud)
error[E0277]: a value of type `Vec<i32>` cannot be built from an iterator over elements of type `&i32`
 --> src/main.rs:2:37
  |
2 |     v.iter().filter(|x| x % 2 == 0).collect()
  |                                     ^^^^^^^ value of type `Vec<i32>` cannot be built from `std::iter::Iterator<Item=&i32>`
  |
  = help: the trait `FromIterator<&i32>` is not implemented for `Vec<i32>`
  = help: the trait `FromIterator<T>` is implemented for `Vec<T>`
note: required by a bound in `collect`
Run Code Online (Sandbox Code Playgroud)

.iter()在通过引用传递和按值传递时在函数内部使用.into_iter(),不确定这些是否是正确使用的函数。

Nov*_*zen 7

使用v.iter().filter(|x| x % 2 == 0).cloned().collect()。这将(简单地)将每个&i32引用克隆为实际i32值。

  • 您可以使用“copied()”而不是“cloned()”来断言(在编译时)克隆是微不足道的。 (4认同)