👌
Rustの「トレイト」が理解しにくい原因(個人の感想です)
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
まあ日本語でも
Walkという機能をDogに実装する
って書けば語順通りになるんじゃないかなJavaなんかはオブジェクト指向の権化みたいな言語だから
DogはWalkという機能を持つ
のように主語→述語とかの順番が徹底してるんでしょうね