錆-私を抱きしめる私のdumbness

3960 ワード

私が初めてこのようなコードに遭遇
impl<T> MyTrait for MyStruct<T> {...}
私はなぜ一般的なタイプT 両方の隣に表示するimpl だけでなくMyStruct . なかったMyStruct<T> 意図を伝えるのに十分?
私はAHAを持っていた!今日と同じように見えたプログラムで作業中です.
struct MyStruct<T> {
    x: T    
}

trait Bogus {
    fn do_nothing(&self);
}

// missed the `impl<T>`
impl Bogus for MyStruct<T> {
    fn do_nothing(&self) {
        println!("do nothing")
    }
}

// somewhere way down in the code
type T = i32;

習慣から、私はタイプパラメタを逃しましたT 隣にimpl キーワード.コードはまだコンパイルできます.
その後、何が起こったのか気づいた.だから、私は、実装を終了しましたBogus 一般的な特性MyStruct<T> またはMyStruct<i32> ? あなたが既に推測したかもしれないように、それは後者です.
それは今では明らかにT 隣にimpl 曖昧性解消の目的を果たす.タイプ宣言がすぐに我々の焦点にないので、コンパイラはそれが一般的なタイプであると仮定することができません.
// implement Bogus Trait for MyStruct<T> where T could be any type
impl<T> Bogus for MyStruct<T> {
    fn do_nothing(&self) {
        println!("do nothing")
    }
}

// implement Bogus Trait for MyStruct<T> where T is a type declared somewhere
impl Bogus for MyStruct<T> {
    fn do_nothing(&self) {
        println!("do nothing")
    }
}

私は、それが私がとても明白な何かを方向付けるのにそれほど長くかかったように滑稽に感じます!