提问人:Alberto 提问时间:11/6/2023 最后编辑:John KugelmanAlberto 更新时间:11/6/2023 访问量:39
结构中未推断出默认泛型类型参数
Default generic type parameter not inferred in struct
问:
我有一个泛型结构,带有一个默认的泛型类型参数,实现了特征。这是我的代码:Test
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();
| +++++++++
我已经指定了一个默认的泛型类型参数,因此我希望当我在不指定类型参数的情况下创建实例时,它将默认为 .但是,我收到一个编译器错误,要求我在调用时定义通用参数。我以为默认类型参数会自动推断。我在这里遗漏了什么吗?<I: Implementation = FirstImpl>
Test
FirstImpl
I
new()
为什么不推断默认泛型类型参数?
答:
1赞
Masklinn
11/6/2023
#1
为什么不推断默认泛型类型参数?
因为您已经为块提供了一个新的、不相关的通用参数。就 Rust 而言,结构体和块之间没有直接的联系。这就像使用默认参数声明一个函数,然后使用参数调用它,但拒绝说明该参数是什么。impl
<I: Implementation = FirstImpl>
<I: Implementation>
impl
您可以通过拥有
impl Test {
pub fn new() -> Self {
Self { _p: PhantomData }
}
}
虽然显然该函数是非参数化的,所以你只得到默认值。
评论