8章3〜5節まで。
Rustでの静的/動的ディスパッチの仕組みと存在impl Trait、トレイトの関連xxについて。
5節以外は読むだけスタイルで進めた。
Rustの機能と静的/動的ディスパッチの話は割と面白かった。
しかし、ジェネリクスとトレイトの使い方に慣れないとなぁ。
おぼえがき
- 静的ディスパッチは、ジェネリクスで実現
- 静的ディスパッチは、通常の関数呼び出し形式に変換する
- メリット
- 実行時のオーバーヘッドがなくなる(通常の関数と同じ)
- インライン化による最適化なども効くようになる
- デメリット
- 型ごとに関数本体をコピーするため、コードサイズが大きくなる
- 複数の型を混在させられない。以下はコンパイルエラー
let mut v: Vec<Display> = vec![];
v.push(true); v.push(1i32);
- 動的ディスパッチは、トレイトオブジェクトで実現
- impl Trait
- 全称impl Trait:
fn func(arg: impl TraitName)
- 存在impl Trait:
fn func() -> impl TraitName
- 全称impl Trait:
- トレイトの関連関数
- 引数に
self
をとらない関数は、トレイトの関連関数になる - Javaでいうクラス関数とかstatic関数とか呼んでるものっぽい
TraitName::func()
で呼び出す
- 引数に
- トレイトの関連定数
- トレイト内にconstを付けて定数も作れる
trait TraitName { const CONST_VALUE: u32; }
TraitName::CONST_VALUE
で参照
- トレイトの関連型
- トレイトに関連付いた型を定義できる。
trait TraitName { type TypeName; }
trait TraitName { type TypeName: TraitBounds; }
- trait内、ブロック内では、
Self::TypeName
でアクセスできるfn func(&self, arg: Self::TypeName)
- 型の実体は、実装側で定義
impl type TypeName = String;
- 関連関数・関連定数はデータ型にもある機能だが、関連型はトレイトにしかない
- トレイトに関連付いた型を定義できる。
課題
気になったこと
− P330の本文中の「[:トレイト制約]」って、「トレイト境界」のことなのかな
- そういえばトレイト境界って変な名前
- 作者: κeen,河野達也,小松礼人
- 出版社/メーカー: 技術評論社
- 発売日: 2019/05/08
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る