rust - rust `new` 方法如何知道要返回哪种通用类型的结构?
问题描述
我正在学习 Rust,但有一件事似乎不对
let vector: VecDeque<u32> = VecDeque::new();
该方法如何new
知道VecDeque
要返回哪种类型?可能VecDeque<T>
适用于任何T
. 我来自 C++,如果有一个静态new
方法,它必须被模板化,我必须像这样调用:CppObject<int> cppObject = CppObject<int>()
例如。
解决方案
Rust 做了很多类型推断。在这种情况下,它知道调用VecDeque::<u32>::new()
,因为您明确指定要将其分配给类型的变量,VecDeque<u32>
并且您可以到达那里的唯一方法是如果您new()
在 type 上调用关联的方法VecDeque<u32>
。
请注意,如果您没有注释 的类型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
元素属于 type 的操作,编译器也会成功推断出类型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
}
推荐阅读
- python - 尝试安装 pyInstaller,但是在创建 venv 时出现错误提示“系统找不到指定的路径”。
- websphere - 如何使用 wsadmin 脚本读取 MQ 基本队列名称?
- spring - 一次只有 3 个线程访问 Spring 服务层,同时将其他请求保留在缓冲区中
- ios - 斯威夫特:有没有人让代码在他们的设备上正常工作,但在模拟器中却不行?
- redis - 使用 CLIENT KILL USER 的语法错误
在 Redis 5.9.102 上 - python - 使用 Selenium (Python) 单击按钮的问题
- flask - 使用 SqlAlchemy op.create_table 创建标签时无法使用 db.drop_all()
- javascript - 从 javascript promise (expressjs + neDB) 中提取函数
- scala - IndexedSeq[Int] 与 Array[Int]
- android - 请求应用运行时权限 (Android)