目次

Rustの勉強[高度なトレイト その3]

ぎじゅつ

始めに

#

NO IMAGE高度なトレイト - The Rust Programming Language 日本語版

を読んでいる

お勉強

#

NO IMAGE高度なトレイト - The Rust Programming Language 日本語版

  • 前回やろうとしていたこれ
  • トレイト

メモ

#
trait Pilot {
    fn fly(&self);
}

trait Wizard {
    fn fly(&self);
}

struct Human;

impl Pilot for Human {
    fn fly(&self) {
        // キャプテンのお言葉
        println!("This is your captain speaking.");
    }
}

impl Wizard for Human {
    fn fly(&self) {
        // 上がれ!
        println!("Up!");
    }
}

impl Human {
    fn fly(&self) {
        // *激しく腕を振る*
        println!("*waving arms furiously*");
    }
}
  • んあーなるほど、別のトレイトの同じメソッドか
  • 普通に設計ミスってそうだが
fn main() {
    let person = Human;
    Pilot::fly(&person);
    Wizard::fly(&person);
    person.fly();
}
  • なるほどね、&self だから自身を借用しないといけないのか
trait Animal {
    fn baby_name() -> String;
}

struct Dog;

impl Dog {
    fn baby_name() -> String {
        // スポット(Wikipediaによると、飼い主の事故死後もその人の帰りを待つ忠犬の名前の模様)
        String::from("Spot")
    }
}

impl Animal for Dog {
    fn baby_name() -> String {
        // 子犬
        String::from("puppy")
    }
}

fn main() {
    // 赤ちゃん犬は{}と呼ばれる
    println!("A baby dog is called a {}", Dog::baby_name());
}
  • なるほど
A baby dog is called a Spot
  • こういう結果になるのか
  • 普通に設計ミスだと思ってしまう

Dog に対して Animal 実装を使用したいと明確化し、コンパイラに指示するには、フルパス記法を使う必要があります。

fn main() {
    println!("A baby dog is called a {}", <Dog as Animal>::baby_name());
}
  • いやーだめだろ
    • 呼べるんだけどさ
    • 読みづらすぎる

スーパートレイトを使用して別のトレイト内で、あるトレイトの機能を必要とする

時として、あるトレイトに別のトレイトの機能を使用させる必要がある可能性があります。

  • ほんとに?
    • エッジケースすぎるだろ

まとめ

#
  • 設計ミスだろで片付きそうな機能ばかりでつらいな
  • あまりにもエッジケースすぎて進むのおっそい

次ここ

NO IMAGE高度なトレイト - The Rust Programming Language 日本語版