考虑以下代码:
trait A {}
struct X { p1: i32 }
struct Y { p1: i32, p2: i32 }
impl A for X {}
impl A for Y {}
struct Z<T> where T: A {
data: T
}
impl Z<X> {
fn new(p1: i32) -> Self {
Self { data: X { p1: p1 } }
}
}
impl Z<Y> {
fn new(p1: i32, p2: i32) -> Self {
Self { data: Y { p1: p1, p2: p2 } }
}
}
当创建Z<X>
并Z<Y>
一起像这样:
let zx: Z<X> = Z::new(1);
let zy: Z<Y> = Z::new(2, 3);
编译器抛出一个错误,大概是说Z::new()
存在两次:
error[E0034]: multiple applicable items in scope
--> main.rs:33:23
|
33 | let zx: Z<X> = Z::new(1);
| ^^^ multiple `new` found
|
然而,当创建时Z<X>
,Z<Y>
像这样:
let zx: Z<X> = Z::<X>::new(1);
let zy: Z<Y> = Z::<Y>::new(2, 3);
一切都编译得很好。
现在我想知道:如果给定类型注释应该已经知道该信息,为什么需要手动指定<X>
and的用法?<Y>
作为后续问题:为什么new()
在 Z 中似乎存在两次,但在Z<X>
和 中Z<Y>
分别只存在一次?关于 Rust 类型系统有什么我没有得到的吗?
- rustc 版本 1.77.1
(请原谅我可能错误地使用了一些 Rust 术语,我是 Rust 新手,来自 C++)
如果您将
new
函数及其参数类型包装在工厂特征中,它就会起作用。尽管它需要单个构造函数参数,但需要一个元组而不是多个参数: