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

js5cn81o  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(117)

我有一个泛型结构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。我以为默认类型参数会自动推断。我错过了吗这里有什么吗
为什么不推断默认泛型类型参数?

wztqucjr

wztqucjr1#

为什么不推断默认泛型类型参数?
因为你已经为impl块提供了一个新的、无关的、泛型的参数。就Rust而言,结构体的<I: Implementation = FirstImpl>impl块的<I: Implementation>之间没有直接的联系。这就像声明一个带有默认参数的函数,然后用一个参数调用它,但拒绝说明这个参数是什么。
你可以通过一个

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

字符串
虽然很明显这个函数是非参数的,所以你只能得到默认值。

相关问题