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

5
我希望能够有多个版本的函数,针对不同类型的参数进行优化,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需要类型注释:

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

我能避免在调用时提供类型注释吗?如果必须提供,应该如何做?


1
任何泛型函数的当前特化都是一个可能并不真正意味着要工作的怪癖(即它是一个错误)。真正的特化是一个提议但尚未实现的功能。 - huon
@huon:这不应该作为一个答案吗,即使它是临时的? - Matthieu M.
1个回答

12

请记住,您总是为某些东西实现trait。因此,trait实现必须始终包含for子句:always

impl SomeTrait for Something
如果没有for关键字,那么这就不是一个特质实现。在你的情况下,impl Foo<i32> 不是针对于i32或者其他你所认为的类型 Foo 的实现;它是在裸特质对象类型 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);
}

这段代码可行

需要注意的是现在Foo已经被实现为某个特定类型的trait。实现trait的类型可以通过隐式的Self类型参数获得,并且您可以查看其在foo()声明中的使用方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接