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

问题描述 投票:0回答:2

我的函数是结构的一部分(出于上下文原因),它不采用

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
2个回答
6
投票

有没有一种方法可以在不模拟结构体或从结构体实现中删除函数的情况下调用它?

不。据 Rust 所知,每个

SomeStruct<T>::some_function_that_does_not_take_self
都是完全不同的。他们也可能有不同的行为,请考虑这一点:
T



0
投票
orlp所说

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

对于这个小功能和测试来说需要付出很多努力

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

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'. }

另请参阅:

    trait 边界应该在 struct 和 impl 中重复吗?
© www.soinside.com 2019 - 2024. All rights reserved.