# 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
という名前のモジュールと書いてあるので、クレートとモジュールは同じもの?
- 肥大化していくプロジェクトをパッケージ、クレート、モジュールを利用して管理する - The Rust Programming Language 日本語版
- モジュールシステム
- パッケージ(package): クレートをビルドし、テストし、共有することができるCargoの機能
- クレート(crate): ライブラリか実行可能ファイルを生成する、木構造をしたモジュール群
- モジュール(module)
- パス(path)
-
パッケージは複数のバイナリクレートからなり、またライブラリクレートを1つもつこともできます。
- Cargoは
src/main.rs
が、パッケージと同じ名前を持つバイナリクレートのクレートルートであるという慣習に従っている - Cargoはパッケージディレクトリに
src/lib.rs
が含まれていたら、パッケージにはパッケージと同じ名前のライブラリクレートが含まれており、src/lib.rs がそのクレートルートなのだと判断します
- モジュールシステム
- クレート - Rust By Example
-
クレートはRustにおけるコンパイルの単位です
-
クレートに名前を付ける、という方法を調べていたのだが、パッケージ名が src/main.rs
はバイナリクレートの名前に、src/lib.rs
はライブラリクレートの名前にそれぞれなるように見える。
ダメだ、自分で調べてもよくわからない・・・。
ChatGPT氏に訊ねた。
- ライブラリクレートは基本的にパッケージ名と同じだが Cargo.toml の設定で変更可能
- バイナリクレートはファイル名と同じになる
- ライブラリクレートは
use
するがバイナリクレートは実行が主用途なのでuse
しない
やつ(ChatGPT)の目は嘘をついているように見えなかった。
こいつにならだまされてもいい・・・というわけにはいかんが、まだ確認できる段階ではないので放置だ。
同じパッケージ内だと main.rs
だろうと lib.rs
だろうと違いがそんなにないし、そこがわかるまではそのままでよい。
おわりに
10.2章は半分も終わっていない。
インターフェースっぽいなら interface
にしておけばよいのにと思わなくもないが、
別物だからそうしなかったのだろう。
今のところ、C++ の pure じゃない virtual
というイメージだ。
デフォルト実装も持てるし。
今の知識だけだとデフォルト実装を持つことができるというくらいしかメリットがない。
だいたいこの手の機能は、インスタンスを差し替えてメソッドを呼ぶとそれぞれにあったメソッドに呼び変えられる、みたいなことになる。
さあ、Rust はどうなのかな?