Rust Vev<_> 作用与用法

Vec<_> 是什么,怎么用

可以少写类型,让编译器补全

pub fn main() {
    let letters: Vec<_> = vec!["a", "b", "c"]; // Vec<&str>
}

避免使用 turbofish

fn main() {
    let bar = [1, 2, 3];
    let foos = bar.iter()
                  .map(|x| format!("{}", x))
                  .collect::<Vec<String>>(); // 使用 turbofish 指定目标类型
}

比较

fn main() {
    let bar = [1, 2, 3];
    let foos: Vec<_> = bar // 使用 '_' 类型使编译器推断容器成员的类型
            .iter()
            .map(|x| format!("{}", x))
            .collect(); // 不需要通过'turbofish'指定目标类型.
}

变量类型指定

通过注解变量类型

可以显示确定collect的类型.

let a = [1, 2, 3];
let doubled: Vec<i32> = a.iter()
                         .map(|&x| x * 2)
                         .collect();
assert_eq!(vec![2, 4, 6], doubled);

let doubled2: VecDeque<i32> = a.iter().map(|&x| x * 2).collect();
// collect 只关心收集目标的容器类型,可以用 _ 代替具体类型
let doubled2: VecDeque<_> = a.iter().map(|&x| x * 2).collect();

如上代码,可以collect成 Vec<i32> 或者 VecDeque<i32>

使用’turbofish’ : ::<>

let a = [1, 2, 3];
let doubled = a.iter().map(|x| x * 2).collect::<Vec<i32>>();
// collect 只关心收集目标的容器类型,可以用 _ 代替具体类型
let doubled = a.iter().map(|x| x * 2).collect::<Vec<_>>();
assert_eq!(vec![2, 4, 6], doubled);

这样就不需要写变量的注解

参考

https://stackoverflow.com/a/37215830

https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect