7章10〜12節。
単一の所有者を持たせて必要なときに借用する方法で対応できない場合の話。
こういう方法があるよという紹介。
今は覚えられる気がしないので、読むだけのスタイルでサクッと進む。
頭がpanic!()
。
今はこんなのがあるんだなー程度。
おぼえがき
- 複数の所有者(共同所有権)を持たせたい場合に便利な型
std::rc::Rc
std::arc::Arc
マルチスレッド向け(Syncトレイト実装)- 参照カウンタを持たせる感じ
- 弱い参照も作れる
- 内側のミュータビリティ
- ?演算子を使う場合、main関数も戻り値の型をResult型にする必要があるっぽい
fn main() -> Result<(), Box<dyn Error>>
- mainの末尾は
Ok(())
- static変数は、プログラム終了時にデストラクタ(drop)を呼ばないっぽい
- Derefの仕組みを応用しているとか
- アリーナ・アロケータ
- 関連するデータを1つのヒープ領域(アリーナ)でまとめて管理する
- 各個別のデータが不要になっても破棄しない
- アリーナがスコープから抜けるときに一括で削除
- 2種類ある
- typed area
- 単一の型のみを格納できる
typed-arena
クレートがよく使われているとのこと
- areana
- 複数の方を混在させて格納できる
toolshed
クレート- アリーナ・アロケータにSet/Map/Listをセットにしたもの?
- typed area
- 参照カウントは循環参照時のメモリ解放が苦手なので、そんなときは検討してみるといいかもね
- 複雑なデータ構造や大量データを扱うときも検討してみるといいかもめ
- 関連するデータを1つのヒープ領域(アリーナ)でまとめて管理する
クロージャが自動で実装するトレイト (o:実装する, x:実装しない)
環境を表す匿名構造体の使い方 | Fn | FnMut | FnOnce |
---|---|---|---|
空の環境(変数の捕捉なし) | o | o | o |
補足した変数を変更しない(読むだけ) | o | o | o |
補足した変数を変更する。かつ所有権を移動するフィールドがない | x | o | o |
補足した変数を変更する。かつ所有権を移動するフィールドがある | x | x | o |
- Fnトレイト
- クロージャが不変の環境を持つことを示す
- FnMutとFnOnceも実装する
- FnMutトレイト
- クロージャが可変の環境を持つことを示す
- FnOnceも実装する
- FnOnceトレイト
- クロージャが、環境からクロージャ本体へ所有権が移動することを示す
- その為、FnOnceトレイトを実装したクロージャは一度しか実行できない
課題
- 本節(P287〜303)の内容はある程度Rustに慣れてから読み返さないとダメかな
- 複数の所有者(共同所有者)を実現するポインタ
- 内側のミュータビリティ(借用チェックの迂回)
- クロシージャと所有権
- 作者: κeen,河野達也,小松礼人
- 出版社/メーカー: 技術評論社
- 発売日: 2019/05/08
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る