我想要为其参数类型优化一个函数的多个版本,并根据上下文调用适当的函数.
在我的例子中,所有参数都具有相同的类型,并且都是等价的,因此它宁可避免使用self
参数.
我试过这段代码:
trait Foo{ fn foo(a: T, b: T, c: T); } impl Foo { fn foo(a: i32, b: i32, c: i32) {} } impl Foo { fn foo(a: i16, b: i16, c: i16) {} } fn main() { Foo::foo(1i32,2,3); Foo::foo(1i16,2,3); }
但Rust需要类型注释:
错误:需要输入注释:无法解析
_ : Foo
[E0283]
我可以避免在呼叫站点提供类型注释吗?如果必须,怎么办?
请记住,你总是为某些东西实现一个特征.因此,特征实现必须始终包含for
子句:
impl SomeTrait for Something
如果没有for
,那么它不是特质实现.你的情况impl Foo
是不是的实现Foo
为i32
或任何你认为它是; 它是裸特征对象类型的固有方法声明子句. Foo
你真正想要的是使用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()
声明中的使用方式.