Rust の入門書(通称 the book, TRPL)の個人的なハイライトを列挙する。
- Ch.03.3 関数
- 式志向
- Ch.04.2. 参照と借用
- 借用 期間の解釈
- 単純にスコープ単位じゃない
- 「参照の宣言」(借用の発生) から 「参照の最終利用」(借用の終了) までの区間を考える
- 借用 期間の解釈
- Ch.04.3. スライス型
- 文字列リテラルはスライス型 (
&str
) - 文字列の不変参照を受け取る関数で、引数の型を
&str
(スライス)にしておくと、文字列リテラルと String 型の 両対応 になる!!
- 文字列リテラルはスライス型 (
- Ch.08: 一般的なコレクション
- コレクションと文字列をより深く理解する!!
- Ch.10.3. ライフタイムで参照を検証する
- ライフタイムとは、参照(= 対象のアドレス)の有効性 に関する概念
- ダングリング参照 を回避するために、関数が 正しく 構成されている事(関数の内側)、関数が正しく利用されている事(関数の外側)を、コンパイラが自動的に検証する。
- 「正しさ」は、引数や戻り値における 参照感のライフタイムの関係 で規定されて、多くの場合は自動的に推論される。推論しきれない場合は、ライフタイム注釈記法で明示的に指定しなければならない。
- 要確認
- ライフタイムとスコープの違い?
- Ch.12.5. 環境変数を取り扱う: エクササイズ
- Ch.13.1. クロージャ: 環境をキャプチャできる匿名関数
- キャプチャー: 3 種類のトレイト
- 重要: 一見 FnOnce が最も制約が強そうだが、FnOnce は全てを包含する基底トレイト
- コンパイラは、クロージャの 環境を使用する方法 に基づいて型を推論
- 推論の順序: FnOnce → FnMut → Fn
- Ch.15. スマートポインタ
- 今後の課題: 双方向リスト、グラフ
- Ch.16. 恐れるな!並行性
- 何となく分かった気になってる 並行と並列 について、一度ちゃんと勉強する ← 今後の課題!
- Ch.16.3. 状態共有並行性
- アトミック型
- Ordering: メモリの同期方法 ← 要調査!
- デッドロック の再現と対処法
- アトミック型
- Ch.16.4. Sync と Send トレイトで拡張可能な並行性
- 誤解 1: Sync トレイトの意味。どうやら「参照」という言葉に惑わされた感がある。Arc でスレッド間で共有可能 かどうかの意味で利用されるようだ。
- 誤解 2: 「
T
: Sync&T
: Send」の意味。むしろ&T: Send
、つまり 参照型に対する Send の定義 だった。
- Ch.17: Rust のオブジェクト指向プログラミング機能
- Ch.17.2. トレイトオブジェクトで異なる型の値を許容する
- 注意点 1:
&
参照やBox<T>
スマートポインタなど、 何らかのポインタを指定しなければならない ← 理由はトレイトオブジェクトがSized
ではないため (cf. Ch.19.3.) - 注意点 2: Rust 2021 から、
Box<dyn T>
と明示が必要になる!→ dyn とは? - 注意点 3: コンパイラは具体的な型を知りようがないので、 トレイトオブジェクトは オブジェクト安全 でなければならない。
- ジェネリックな型引数の場合、スタティックディスパッチとダイナミックディスパッチを組み合わせて、頑張ればメソッドを呼び出せそうな気がする。何故駄目なのか?
- 注意点 1:
- Ch.17.3. オブジェクト指向デザインパターンを実装する
- ステートパターンをオーソドックスに実装
- → 所有権など Rust 特有の癖で結構大変!!
- 注意点 0: State トレイトのメソッドは、参照
&self
ではなく、何故self
と 消費 するのか?- → トレイトオブジェクトが Copy トレイトを実装するとは限らないため、参照では 状態遷移しない恒等写像 が安価に実現できない。
- 注意点 1: State トレイトのメソッドの引数の型が
self: Box<Self>
? → 具体例は下記詳述- → トレイトオブジェクトでは、self(実体)のサイズが不定 ため、そのまま消費(所有権の移動)できない
- 注意点 2: Post 構造体の state フィールドが Option 型?
- →
構造体に 未代入 のフィールドを持たせてくれないから← 半分正しい、半分誤り? - → より正確には、参照(&mut self)の背後 にある値(self.state、トレイトオブジェクト)は、Copy トレイトを実装していないので、所有権の移動 が出来ない
- →
- Rust でオブジェクト指向のデザインパターンが実装可能であるものの、必ずしも最善の解決策とは限らない
- 上手く Rust の強みを活かすと、コンパイル時に 一部のバグを回避できるなどの利益が得られることもある
- ステートパターンをオーソドックスに実装
- Ch.17.2. トレイトオブジェクトで異なる型の値を許容する
- Ch.18.3. パターン記法 ← パターンのリファレンス
- 参照の分配 ← 構造体など色々と試して理解を深める!
- Ch.19.3. 高度な型
- never 型(Empty 型) ← まだ理解不足!
- 動的サイズ決定型
- Ch.19.5. マクロ
- Ch.20.2. シングルスレッドサーバをマルチスレッド化する
- 注意点 1: ジョブ job(FnOnce トレイトオブジェクト)の実行
- 注意点 2: ワーカースレッドのループで、何故 while let を使うべきではない のか?(cf. Ch.18.1. パターンが使用されることのある箇所全部)
- Ch.20.3. 正常なシャットダウンと片付け
- 注意点 1: Worker 構造体の thread フィールドの型
- 注意点 2: Drop トレイトのループ
- 今後の課題
- CTRL-C で本当に Graceful に止まるようにする。
- 章末の課題