実践Rust入門 8日目 その2

7章10〜12節。

単一の所有者を持たせて必要なときに借用する方法で対応できない場合の話。
こういう方法があるよという紹介。

今は覚えられる気がしないので、読むだけのスタイルでサクッと進む。

頭がpanic!()

今はこんなのがあるんだなー程度。

おぼえがき
  • 複数の所有者(共同所有権)を持たせたい場合に便利な型
    • std::rc::Rc
    • std::arc::Arc マルチスレッド向け(Syncトレイト実装)
    • 参照カウンタを持たせる感じ
    • 弱い参照も作れる
  • 内側のミュータビリティ
    • コンパイル時の借用チェックを迂回してデータを可変にする
    • std::cell::Cell
    • std::cell::RefCell
    • Mutex型、RwLock型 マルチスレッド向け
    • thread_local!()でスレッドローカルストレージ(TLS)に配置できるっぽい
    • 可変な値を複数のスレッドで共有する実装例
      • ArcとRwLockを組み合わせる
        • Arc::new(RwLock::new(val))
      • static変数とRwLockを組み合わせる
        • lazy_static::lazy_static
      • シグネチャが複雑になりがちなので、型エイリアスを活用しようね
  • ?演算子を使う場合、main関数も戻り値の型をResult型にする必要があるっぽい
    • fn main() -> Result<(), Box<dyn Error>>
    • mainの末尾はOk(())
  • static変数は、プログラム終了時にデストラクタ(drop)を呼ばないっぽい
    • Derefの仕組みを応用しているとか
  • アリーナ・アロケータ
    • 関連するデータを1つのヒープ領域(アリーナ)でまとめて管理する
      • 各個別のデータが不要になっても破棄しない
      • アリーナがスコープから抜けるときに一括で削除
    • 2種類ある
      • typed area
        • 単一の型のみを格納できる
        • typed-arenaクレートがよく使われているとのこと
      • areana
        • 複数の方を混在させて格納できる
        • toolshedクレート
          • アリーナ・アロケータにSet/Map/Listをセットにしたもの?
    • 参照カウントは循環参照時のメモリ解放が苦手なので、そんなときは検討してみるといいかもね
    • 複雑なデータ構造や大量データを扱うときも検討してみるといいかもめ
クロージャが自動で実装するトレイト (o:実装する, x:実装しない)
環境を表す匿名構造体の使い方 Fn FnMut FnOnce
空の環境(変数の捕捉なし) o o o
補足した変数を変更しない(読むだけ) o o o
補足した変数を変更する。かつ所有権を移動するフィールドがない x o o
補足した変数を変更する。かつ所有権を移動するフィールドがある x x o
課題
  • 本節(P287〜303)の内容はある程度Rustに慣れてから読み返さないとダメかな
    • 複数の所有者(共同所有者)を実現するポインタ
    • 内側のミュータビリティ(借用チェックの迂回)
    • クロシージャと所有権

実践Rust入門[言語仕様から開発手法まで]

実践Rust入門[言語仕様から開発手法まで]