首页 > 解决方案 > rust `new` 方法如何知道要返回哪种通用类型的结构?

问题描述

我正在学习 Rust,但有一件事似乎不对

let vector: VecDeque<u32> = VecDeque::new();

该方法如何new知道VecDeque要返回哪种类型?可能VecDeque<T>适用于任何T. 我来自 C++,如果有一个静态new方法,它必须被模板化,我必须像这样调用:CppObject<int> cppObject = CppObject<int>()例如。

标签: rust

解决方案


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
}

推荐阅读