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