如何实现通用函数的专用版本?

How to implement specialized versions of a generic function?

我想要一个函数的多个版本针对其参数类型进行优化,Rust 会根据上下文调用适当的版本。

在我的例子中,所有参数都具有相同的类型,并且都是等价的,所以最好避免使用 self 参数。

tried this code:

trait Foo<T> { 
    fn foo(a: T, b: T, c: T); 
}

impl Foo<i32> {
    fn foo(a: i32, b: i32, c: i32) {}
}

impl Foo<i16> {
    fn foo(a: i16, b: i16, c: i16) {}
}

fn main() {
    Foo::foo(1i32,2,3);
    Foo::foo(1i16,2,3);
}

但 Rust 需要类型注释:

error: type annotations required: cannot resolve _ : Foo<i32> [E0283]

我可以避免在调用站点提供类型注释吗?如果我必须这样做,该怎么做?

请记住,您总是为实现一个特征。因此,trait 实现必须 always 包含 for 子句:

impl SomeTrait for Something

如果没有for,则不是trait实现。在您的情况下,impl Foo<i32> 不是 Fooi32 或您认为的任何实现;它是 bare trait object type Foo<i32>.

上的 inherent 方法声明子句

您真正想要的可以使用 Self 类型参数来实现:

trait Foo { 
    fn foo(a: Self, b: Self, c: Self); 
}

impl Foo for i32 {
    fn foo(a: i32, b: i32, c: i32) {}
}

impl Foo for i16 {
    fn foo(a: i16, b: i16, c: i16) {}
}

fn main() {
    Foo::foo(1i32,2,3);
    Foo::foo(1i16,2,3);
}

此代码works.

请注意,现在 Foo 已针对 特定类型 实施。特征实现的类型可通过隐式 Self 类型参数获得,您可以在 foo() 声明中看到它是如何使用的。