hiro99ma blog

Something technical

# rust: Rustがんばろう 14日目

2025/04/13

はじめに

トレイトだ、トレイト。

10.2章

トレイトは、Rustコンパイラに、特定の型に存在し、他の型と共有できる機能について知らせます。 トレイトを使用すると、共通の振る舞いを抽象的に定義できます。トレイト境界を使用すると、 あるジェネリックが、特定の振る舞いをもつあらゆる型になり得ることを指定できます。

文章の意味が分からん。。。
原文もそうなので、日本語が分からんのではなく文章が分からんなのだ。

trait

“trait” は特徴、特色、特性、のような意味を持つ名詞だ。
characteristic も似たような意味だ。

うーん・・・。
trait は遺伝的な特徴という意味を持つので使われたのかな?

インターフェースっぽいらしい

サンプルはこうなのだが、アプリではなく src/lib.rs に書いている。

pub trait Summary {
    fn summarize(&self) -> String;
}

impl <trait名> for <type名> で実装することができる。
type に共通項がなくてもよいし、type の定義に何かする必要もなさそう。
golang の interface みたいな感じかな? あっちはもっとふわっとしていて、シグネイチャーが一致していれば OK だったので、 後から追加するのは楽なのだけど、なんかこう明記されていないので落ち着かないのだ。ええ、個人の感想ですよ。

src/main.rs はこんな感じに use すると呼び出せた。
私は覚えていなかったので vscode がやってくれたのだ。
うむ、ツールはこうあるべきだな。

use hello::{Summary, Tweet};

fn main() {
    let tweet = Tweet {
        username: String::from("horse_ebooks"),
        content: String::from(
            "of course, as you probably already know, people",
        ),
        reply: false,
        retweet: false,
    };

    println!("1 new tweet: {}", tweet.summarize());
}

クレートってなんだっけ

このlib.rsをaggregatorと呼ばれるクレート専用にして、 誰か他の人が私たちのクレートの機能を活用して自分のライブラリのスコープに定義された構造体にSummaryトレイトを実装したいとしましょう。

よくわからんが、クレートに名前を付ければよいのだろう。

まず、crate を忘れてしまった。。
単語の意味は「木箱」。

ツリー構造だから木箱である crate にしたんだろうか、みたいなのを考えていた気がするがその程度だ。

べたっと書くとクレートルートになる。 crate という名前のモジュールと書いてあるので、クレートとモジュールは同じもの?

クレートに名前を付ける、という方法を調べていたのだが、パッケージ名が src/main.rs はバイナリクレートの名前に、src/lib.rs はライブラリクレートの名前にそれぞれなるように見える。
ダメだ、自分で調べてもよくわからない・・・。

ChatGPT氏に訊ねた。

やつ(ChatGPT)の目は嘘をついているように見えなかった。
こいつにならだまされてもいい・・・というわけにはいかんが、まだ確認できる段階ではないので放置だ。
同じパッケージ内だと main.rs だろうと lib.rs だろうと違いがそんなにないし、そこがわかるまではそのままでよい。

おわりに

10.2章は半分も終わっていない。
インターフェースっぽいなら interface にしておけばよいのにと思わなくもないが、 別物だからそうしなかったのだろう。

今のところ、C++ の pure じゃない virtual というイメージだ。
デフォルト実装も持てるし。

今の知識だけだとデフォルト実装を持つことができるというくらいしかメリットがない。
だいたいこの手の機能は、インスタンスを差し替えてメソッドを呼ぶとそれぞれにあったメソッドに呼び変えられる、みたいなことになる。
さあ、Rust はどうなのかな?


 < Top page


コメント(Google Formへ飛びます)

GitHub

X/Twitter

Homepage