首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vec<_>与Vec<T>的区别

Vec<_>与Vec<T>的区别
EN

Stack Overflow用户
提问于 2021-12-13 16:35:55
回答 2查看 113关注 0票数 0

我一直在研究“锈蚀中的行动”( Rust in Action )一书,我还看到了泛型语法Vec<T>,在我的理解中,T是任何类型,但我也看到了Vec<_>,它根据向量的内容推断了类型。我想知道Vec<T>Vec<_>之间的区别是什么,因为我无法分辨它们之间的区别,因为它们似乎在做同样的事情。或者他们的描述会让我相信。我为什么要用一个对另一个?

EN

回答 2

Stack Overflow用户

发布于 2021-12-13 16:41:49

_被称为通配符。它基本上告诉Rust只需要推导出所需的类型,仅此而已。

对于Vec<T>,它是一个通用,它做两件事,它命名类型,但也是任何类型的通用参数。由于您不知道它可以是哪种类型,所以您可以使用T来告诉应该是哪种类型的地方,从哪里(从某种意义上)获取信息。

因此,_意味着任何类型,但在上下文中(一个唯一类型),T是一个泛型类型,可以是多个类型(它遇到的每一个单独的类型都会执行新一代)。

票数 3
EN

Stack Overflow用户

发布于 2021-12-13 16:48:47

Vec<T>可以定义为(实际定义更为复杂):

代码语言:javascript
复制
pub struct Vec<T> {
    buf: RawVec<T>,
    len: usize,
}

因此,它被称为Vec<T>,因为泛型结构就是这样定义的。在创建Vec时,必须指定元素的类型:

代码语言:javascript
复制
let x: Vec<u8> = vec![1, 2, 3];

这里,类型注释实际上并不需要,因为编译器可以为我们推断它。

假设我们希望获得作为Vec的所有命令行参数。我们可以尝试:

代码语言:javascript
复制
let args = std::env::args().collect();

在以下方面失败的...but:

代码语言:javascript
复制
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>还有更多中。让我们指定一个类型:

代码语言:javascript
复制
let args: Vec<String> = std::env::args().collect();

这可以编译,但是我们可以让它变得更简单:我们可以做到

代码语言:javascript
复制
let args: Vec<_> = std::env::args().collect();

并获得同样的效果,因为_告诉编译器推断类型是什么。由于编译器只推断出一种可能的类型,所以它将_替换为StringVec<_>不是一种类型,而是一种使编译器填充_的部分类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70337941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档