[英]How can a rust `new` method know which generic type of structure to return?
我正在学习 Rust 有一件事似乎不对
let vector: VecDeque<u32> = VecDeque::new();
new
方法如何知道要返回哪种类型的VecDeque
? 可以是任何T
的VecDeque<T>
。 我来自 C++,如果有一个 static new
方法,它必须被模板化,我必须像这样调用: CppObject<int> cppObject = CppObject<int>()
例如。
Rust 做了很多类型推断。 在这种情况下,它知道调用VecDeque::<u32>::new()
因为您明确指定要将其分配给VecDeque<u32>
类型的变量,并且您可以到达那里的唯一方法是调用与VecDeque<u32>
类型完全相同的关联方法new()
。
请注意,如果您没有注释vector
的类型,它将无法编译:
use std::collections::VecDeque;
fn main() {
let vector = VecDeque::new();
}
error[E0282]: type annotations needed for `std::collections::VecDeque<T>`
--> src/main.rs:4:18
|
4 | let vector = VecDeque::new();
| ------ ^^^^^^^^^^^^^ cannot infer type for type parameter `T`
| |
| consider giving `vector` the explicit type `std::collections::VecDeque<T>`, where the type parameter `T` is specified
但是,如果之后有操作明确VecDeque
元素的类型为u32
,编译器也会成功推断类型:
use std::collections::VecDeque;
fn main() {
let mut vector = VecDeque::new(); // type not yet known
vector.push_back(123); // append untyped integer, type not yet known
let expected: u32 = 123;
assert_eq!(vector[0], expected); // A-ha! vector[0] returns T
// and T is compared with u32,
// so it must follow that T is u32
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.