7章2〜8節。
サンプルコードを打ち込み動かしながら読むスタイルで進める。
P258のコラム(デストラクタを呼ばないようにする方法)は良かった。
知らないとunsafeでやっちゃいそうだし。
おぼえがき
- デストラクタも実装できる
use std::ops::Drop
impl Drop for StrctName { fn drop(&mut self) {} }
- デストラクタを実行させないための方法
std::mem::forget
- コンパイラはこの関数に渡した値のことを忘れる
Box::into_raw
- この関数にBox
の値を渡すと、ボックスポインタが可変の生ポインタに変換される - コンパイラは生ポインタのライフタイムを追跡せず、値も破棄されない
Box::from_raw
でBox型に戻せる
- この関数にBox
Box::leak
- この関数に*Box
の値を**渡すと、 &mut T
に変換する - 内部で
Box::into_raw
を呼んでいるとのことBox::from_raw
でBox型に戻せる
- この関数に*Box
- これらの関数はリソースリークにつながる可能性がある
- これらがunsafeでなくても使える
- Rustではリソースリークしてもメモリ安全性は保たれているとみなすため
- これらがunsafeでなくても使える
- ムーブセマンティクス
- コピーセマンティクス
- Copyトレイト(std::marker::Copy)を実装すると、値はムーブではなくコピーされる
- Copyトレイトの実装には、以下の条件を満たすこと
- Copyトレイトを実装した主な型
- CopyとCloneの違い
- Copyは、単純なbyteレベルのコピー。複製ロジックはカスタマイズ可能。所有権が移動する文脈で勝手に呼ばれる
- Cloneは、複製ロジックをカスタマイズできる。明示的に
clone
メソッドを呼ぶ
- 借用
- &をつければ借用できる(参照になる)
- 関数の仮引数定義も、実引数で渡すときも&が必要
- 借用チェッカによって、借用規則をチェックする
- 借用チェッカには、2つの実装がある
- 従来版: レキシカルスコープに基づくライフタイム推論
- 新しい版: 通称NLL(Non-Lexical-Lifetime)。制御フローグラフに基づくライフタイム推論を行うとか
- 現在(Edition 2018)は、NLLが使われるとのこと
- 借用チェッカには、2つの実装がある
課題
- なんでCopyトレイトの実装条件に、「デストラクタがないこと」が条件なんだろう
気になったこと
- P261の図7.2は、直前と直後の状態の図を並べないとあまり効果がない気が。。。
- P263のサンプルコードのf2関数でコンパイルエラー。usizeに-1かけちゃダメっぽい
- match式の「腕の中」という表現は慣れないなぁ
- 作者: κeen,河野達也,小松礼人
- 出版社/メーカー: 技術評論社
- 発売日: 2019/05/08
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る