【问题标题】:How do I call an associated function on a generic type without providing the generic type?如何在不提供泛型类型的情况下调用泛型类型的关联函数?
【发布时间】:2021-07-02 17:29:13
【问题描述】:

我的函数是结构的一部分(出于上下文原因),它不采用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();

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

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

【问题讨论】:

    标签: generics rust self type-annotation


    【解决方案1】:

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

    没有。 Rust 都知道SomeStruct&lt;T&gt;::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'.
    }
    

    【讨论】:

    • 好的,谢谢!因此,对于测试,我将只使用一种用于结构的类型并像这样调用它:let some_string = SomeStruct::&lt;SomeType&gt;::some_function()
    【解决方案2】:

    作为orlp said:不,你必须提供一个具体的类型。

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

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

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

    另见:

    【讨论】:

    • 您当然也可以在结构定义中提供默认类型:struct SomeStruct&lt;T = ()&gt;(T);——如果默认类型可以接受,则不再需要在关联函数调用中提供显式类型.
    • 或者,如果由于某种原因添加默认类型是不可接受的,则可以使用类型别名 type UnitSomeStruct = SomeStruct&lt;()&gt;; 并通过它调用关联的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多