3

我想要针对其参数类型优化的函数的多个版本,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);
}

但是 Rust 需要类型注解:

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

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

4

1 回答 1

11

请记住,您总是某事实现一个特征。因此,特征实现必须始终包含for子句:

impl SomeTrait for Something

如果没有for,那么它不是特征实现。在您的情况下impl Foo<i32>,不是Foofori32或您认为的任何实现;它是裸特征对象类型的固有方法声明子句。 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特定类型实现的。实现特征的类型可通过隐式Self类型参数获得,您可以看到它在foo()声明中的使用方式。

于 2015-12-26T15:45:57.407 回答