我有一个泛型结构Test
,它有一个默认的泛型类型参数来实现一个trait。下面是我的代码:
pub trait Implementation {
fn test();
}
pub struct FirstImpl;
impl Implementation for FirstImpl {
fn test() {
todo!()
}
}
pub struct SecondImpl;
impl Implementation for SecondImpl {
fn test() {
todo!()
}
}
pub struct Test<I: Implementation = FirstImpl> {
_p: PhantomData<I>
}
impl <I: Implementation> Test <I> {
pub fn new() -> Self {
Self { _p: PhantomData }
}
}
fn main() {
let t = Test::new();
let t2 = Test::<SecondImpl>::new();
}
字符串
测试结果:
error[E0282]: type annotations needed for `Test`
--> src/main.rs:35:9
|
35 |
let t = Test::new();
| ^
|
help: consider giving `t` an explicit type, where the type for type parameter `I` is specified
|
35 |
let t: Test<I> = Test::new();
| +++++++++
型
Playground
我已经指定了一个默认的泛型类型参数<I: Implementation = FirstImpl>
,所以我希望当我创建一个Test
示例而不指定类型参数时,它将默认为FirstImpl
。然而,我得到一个编译器错误,要求我在调用new()
时定义泛型参数I
。我以为默认类型参数会自动推断。我错过了吗这里有什么吗
为什么不推断默认泛型类型参数?
1条答案
按热度按时间wztqucjr1#
为什么不推断默认泛型类型参数?
因为你已经为
impl
块提供了一个新的、无关的、泛型的参数。就Rust而言,结构体的<I: Implementation = FirstImpl>
和impl
块的<I: Implementation>
之间没有直接的联系。这就像声明一个带有默认参数的函数,然后用一个参数调用它,但拒绝说明这个参数是什么。你可以通过一个
字符串
虽然很明显这个函数是非参数的,所以你只能得到默认值。