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、それはトレイトの実装ではありません。あなたの場合、 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);
}

このコードは機能します。

現在、特定のタイプに対してFoo実装されていることに注意してください。トレイトが実装されている型は、暗黙の型パラメーターを介して利用でき、宣言でどのように使用されているかを確認できます。Selffoo()

于 2015-12-26T15:45:57.407 に答える