如何在不提供泛型类型的情况下调用泛型类型的关联函数?

How do I call an associated function on a generic type without providing the generic type?

我的函数是结构的一部分(出于上下文原因),它不采用 self 参数。此外,该结构本身采用具有一些特征限制的通用参数 T

trait SomeRestriction {}
struct SomeStruct<T: SomeRestriction>(T);

impl<T: SomeRestriction> SomeStruct<T> {
    fn some_function_that_does_not_take_self() -> String {
        todo!()
    }
}

我想写一个测试,我想避免给 该函数 self 参数自模拟对象 使用一些通用的结构参数对于那个小函数和测试来说需要付出很多努力。

我为其他测试做了它,因为在那里有必要,但我想尽可能避免它。

我试着这样称呼它:

let some_string = SomeStruct::some_function_that_does_not_take_self();

但它会要求我提供类型注释,即使不需要。

有没有办法在不模拟结构或从结构实现中删除函数的情况下调用它?

Is there a way to call it without mocking the struct or removing the function from the struct implementation?

没有。 Rust 知道 SomeStruct<T>::some_function_that_does_not_take_self 对于每个 T 是完全不同的。他们也可能有不同的行为,考虑一下:

use core::fmt::Debug;

#[derive(Debug, Default)] struct A;
#[derive(Debug, Default)] struct B;

struct C<T> { t: T }
impl<T: Debug + Default> C<T> {
    fn foo() { println!("{:?}", T::default()) }
}

fn main() {
    C::<A>::foo(); // Prints 'A'.
    C::<B>::foo(); // Prints 'B'.
}

As : 不,您必须提供具体类型。

is a lot of effort for that small function and test

对于您的具体示例,您可以编写不同的代码,以便通过删除不需要的特征边界来更容易地提供具体类型:

trait SomeRestriction {}
struct SomeStruct<T>(T);

impl<T> SomeStruct<T> {
    fn some_function_that_does_not_take_self() -> String { todo!() }
}

impl<T: SomeRestriction> SomeStruct<T> {
    // functions that actually use `T`
}

fn main() {
    let some_string = SomeStruct::<()>::some_function_that_does_not_take_self();
}

另请参阅: