结构中未推断出默认泛型类型参数

Default generic type parameter not inferred in struct

提问人:Alberto 提问时间:11/6/2023 最后编辑:John KugelmanAlberto 更新时间:11/6/2023 访问量:39

问:

我有一个泛型结构,带有一个默认的泛型类型参数,实现了特征。这是我的代码: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>TestFirstImplInew()

为什么不推断默认泛型类型参数?

仿制药 蚀性状

评论


答:

1赞 Masklinn 11/6/2023 #1

为什么不推断默认泛型类型参数?

因为您已经为块提供了一个新的、不相关的通用参数。就 Rust 而言,结构体和块之间没有直接的联系。这就像使用默认参数声明一个函数,然后使用参数调用它,但拒绝说明该参数是什么。impl<I: Implementation = FirstImpl><I: Implementation>impl

您可以通过拥有

impl Test {
    pub fn new() -> Self {
       Self { _p: PhantomData }
    }
}

虽然显然该函数是非参数化的,所以你得到默认值。