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

Kor*_*nel 3 traits specialization generic-function rust

我想要为其参数类型优化一个函数的多个版本,并根据上下文调用适当的函数.

在我的例子中,所有参数都具有相同的类型,并且都是等价的,因此它宁可避免使用self参数.

试过这段代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

但Rust需要类型注释:

错误:需要输入注释:无法解析_ : Foo<i32>[E0283]

我可以避免在呼叫站点提供类型注释吗?如果必须,怎么办?

Vla*_*eev 10

请记住,你总是某些东西实现一个特征.因此,特征实现必须始终包含for子句:

impl SomeTrait for Something
Run Code Online (Sandbox Code Playgroud)

如果没有for,那么它不是特质实现.你的情况impl Foo<i32>是不是的实现Fooi32或任何你认为它是; 它是裸特征对象类型固有方法声明子句. Foo<i32>

你真正想要的是使用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);
}
Run Code Online (Sandbox Code Playgroud)

这段代码有效.

请注意,现在Foo针对特定类型实施.通过隐式Self类型参数可以实现为特征实现的类型,您可以看到它在foo()声明中的使用方式.