我一直在研究“锈蚀中的行动”( Rust in Action )一书,我还看到了泛型语法Vec<T>,在我的理解中,T是任何类型,但我也看到了Vec<_>,它根据向量的内容推断了类型。我想知道Vec<T>和Vec<_>之间的区别是什么,因为我无法分辨它们之间的区别,因为它们似乎在做同样的事情。或者他们的描述会让我相信。我为什么要用一个对另一个?
发布于 2021-12-13 16:41:49
发布于 2021-12-13 16:48:47
Vec<T>可以定义为(实际定义更为复杂):
pub struct Vec<T> {
buf: RawVec<T>,
len: usize,
}因此,它被称为Vec<T>,因为泛型结构就是这样定义的。在创建Vec时,必须指定元素的类型:
let x: Vec<u8> = vec![1, 2, 3];这里,类型注释实际上并不需要,因为编译器可以为我们推断它。
假设我们希望获得作为Vec的所有命令行参数。我们可以尝试:
let args = std::env::args().collect();在以下方面失败的...but:
error[E0282]: type annotations needed
--> src/main.rs:2:9
|
2 | let args = std::env::args().collect();
| ^^^^ consider giving `args` a type由于我们没有指定要收集参数的容器:.collect()可以将迭代器元素收集到Vec<T>、Box<[T]>、LinkedList<T>、还有更多中。让我们指定一个类型:
let args: Vec<String> = std::env::args().collect();这可以编译,但是我们可以让它变得更简单:我们可以做到
let args: Vec<_> = std::env::args().collect();并获得同样的效果,因为_告诉编译器推断类型是什么。由于编译器只推断出一种可能的类型,所以它将_替换为String。Vec<_>不是一种类型,而是一种使编译器填充_的部分类型。
https://stackoverflow.com/questions/70337941
复制相似问题