Zenn
👌

Rustの「トレイト」が理解しにくい原因(個人の感想です)

2025/03/21に公開1

Rustの「トレイト」が理解しにくい原因(個人の感想です)

「トレイト(Trait)はインターフェースで、構造体はそれを実装するもの」 というのは何となく理解してます。
でも、
「impl <Trait名> for <Struct名>」
って腹落ちしないんです。
なんかこう…「わかるけど、しっくりこない!」
わかりにくさの正体は、たぶん 「語順」 なんじゃないか?って最近思いました。

こんなふうに感じません?

たとえば、JavaやTypeScriptでインターフェースを実装するときって…

class Dog implements Walk {
    public void walk() {
        System.out.println("ワンワン!散歩するよ!");
    }
}

みたいに、「Dog」という型に対して「Walk」をくっつける(実装する)イメージが強いと思うんですよね。

でもRustでトレイトを実装するときは…

impl Walk for Dog {
    fn walk(&self) {
        println!("ワンワン!散歩するよ!");
    }
}

「Walk を Dog に実装する」みたいなこの語順が、なんかモヤるんです。

頭のの中イメージでは、
「DogにWalkの機能があるよ」
なんです。だから
impl Dog: Walk { ... }(こんな書き方ないですよ、念の為。)
みたいな書き方のほうがしっくり来る気がするんです。
まずDogという対象がいて、そのDogがWalkできることを示す。
その方が自然に感じるんですよね。


Rustはなぜ「impl Walk for Dog」なのか?

たぶん英語の感覚だと自然なんだと思います。

Implement Walk for Dog
→ 「Walkという動きを実装する、誰のために? Dogのために」

みたいな。

でも、日本語の感覚だと

「DogがWalkを実装している」

というふうに「対象をまず説明」したくなる。

Dogの実装ですよ
Walkを持ちますよ

だから
impl Dog: Walk { ... }
と書きたくなる。


まとめ

日本語の感覚なのか、他言語の経験のせいなのか、
個人的にはなかなか馴染めない語順ですが、
英語圏の人たちにはこれがわかりやすいんだろうなと
飲み込むしかないんでしょうね。

Discussion

NPG418NPG418

まあ日本語でもWalkという機能をDogに実装するって書けば語順通りになるんじゃないかな
Javaなんかはオブジェクト指向の権化みたいな言語だからDogはWalkという機能を持つのように主語→述語とかの順番が徹底してるんでしょうね

ログインするとコメントできます