0

我的函数是不带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();

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

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

4

2 回答 2

4

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

不,因为所有 Rust 都知道SomeStruct<T>::some_function_that_does_not_take_self对于 each 来说是完全不同的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'.
}
于 2021-07-02T17:32:44.197 回答
0

正如orlp所说:不,你必须提供一个具体的类型。

为那个小功能和测试付出了很多努力

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

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();
}

也可以看看:

于 2021-07-02T17:49:14.757 回答