Rust Vev<_> 作用与用法

nxdong July 17, 2022 [Rust] #Rust

Vec<_> 是什么,怎么用

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

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

避免使用 turbofish

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

比较

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

变量类型指定

通过注解变量类型

可以显示确定collect的类型.

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

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

使用'turbofish' : ::<>

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

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

参考

https://stackoverflow.com/a/37215830

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