如何实现通用函数的专用版本?
How to implement specialized versions of a 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);
}
但 Rust 需要类型注释:
error: type annotations required: cannot resolve _ : Foo<i32>
[E0283]
我可以避免在调用站点提供类型注释吗?如果我必须这样做,该怎么做?
请记住,您总是为实现一个特征。因此,trait 实现必须 always 包含 for
子句:
impl SomeTrait for Something
如果没有for
,则不是trait实现。在您的情况下,impl Foo<i32>
不是 Foo
的 i32
或您认为的任何实现;它是 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()
声明中看到它是如何使用的。
我想要一个函数的多个版本针对其参数类型进行优化,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 需要类型注释:
error: type annotations required: cannot resolve
_ : Foo<i32>
[E0283]
我可以避免在调用站点提供类型注释吗?如果我必须这样做,该怎么做?
请记住,您总是为实现一个特征。因此,trait 实现必须 always 包含 for
子句:
impl SomeTrait for Something
如果没有for
,则不是trait实现。在您的情况下,impl Foo<i32>
不是 Foo
的 i32
或您认为的任何实现;它是 bare trait object type 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);
}
此代码works.
请注意,现在 Foo
已针对 特定类型 实施。特征实现的类型可通过隐式 Self
类型参数获得,您可以在 foo()
声明中看到它是如何使用的。