生锈错误:无法从`std :: iter :: Iterator <Item =&i32>`生成`std :: vec :: Vec <i32>`类型的值

时间:2020-10-04 20:51:54

标签: rust reference

我是生锈的新手,遇到了错误

std::vec::Vec<i32>无法从std::iter::Iterator<Item=&i32>来构建

当尝试使用函数get_even_numbers()通过引用v而不是值&v传递借来的v时。

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

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

为什么上面的代码会给出错误,但是按值传递却不会,如下所示?

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

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

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

// Even numbers: [0, 2, 4, 6, 8]

1 个答案:

答案 0 :(得分:2)

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