我是Rust的新手。我知道Rust会在编译时预测绑定的类型。以下代码编译并运行。
fn main() {
let mut numbers = Vec::new();
numbers.push(1);
}
numbers
向量的默认类型是什么?
答案 0 :(得分:11)
Vec::new()
依赖于其背景信息。当你把东西推到矢量上时,编译器知道"哦,这是我应该期待的那种对象"。但是,由于您的示例正在推动整数文字1
,这似乎与the default type of an integer literal.
在Rust中,根据上下文,在编译时将为无类型的整数文字赋值。例如:
let a = 1u8;
let b = 2;
let c = a + b;
b
和c
将为u8
s; a + b
将b
指定为与a
相同的类型,因此操作的输出为u8
。
如果未指定类型,编译器似乎选择i32
(每this playground experiment)。因此,在您的具体示例中,如操场上所示,numbers
将是Vec<i32>
。
答案 1 :(得分:4)
Rust中的向量是通用的,这意味着它们没有默认类型 - 除非默认情况下是Vec<T>
(T
是泛型类型参数)或{{3} (_
是Vec<_>
)。
如果编译器没有找到任何相关的类型注释或者无法使用类型推断推断元素类型,它将拒绝构建代码:
let mut numbers = Vec::new();
error[E0282]: type annotations needed
--> src/main.rs:2:23
|
2 | let mut numbers = Vec::new();
| ----------- ^^^^^^^^ cannot infer type for `T`
| |
| consider giving `numbers` a type
您可以尝试使用type placeholder:
进一步验证let mut numbers = Vec::new();
let () = numbers;
error[E0308]: mismatched types
--> src/main.rs:4:9
|
3 | let () = numbers;
| ^^ expected struct `std::vec::Vec`, found ()
|
= note: expected type `std::vec::Vec<_>` // Vec<_>
found type `()`