実践Rust入門 7日目 その2

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::leak
        • この関数に*Boxの値を**渡すと、&mut Tに変換する
        • 内部でBox::into_rawを呼んでいるとのこと
          • Box::from_rawでBox型に戻せる
      • これらの関数はリソースリークにつながる可能性がある
        • これらがunsafeでなくても使える
          • Rustではリソースリークしてもメモリ安全性は保たれているとみなすため
  • ムーブセマンティクス
    • let b = aとしたとき、所有権はaからbに移動する
    • 所有権の移動を伴う操作は以下
      • パターンマッチ (let文による変数束縛も含む)
      • 関数呼び出し
      • 関数やブロックからのリターン
      • コンストラク
      • moveクロージャ
  • コピーセマンティクス
    • Copyトレイト(std::marker::Copy)を実装すると、値はムーブではなくコピーされる
    • Copyトレイトの実装には、以下の条件を満たすこと
      1. その型の全てのフィールドの型がCopyトレイトを実装している
      2. その型自身と全てのフィールドの型がデストラクタを実装していない
      3. ヒープを使用する型はデストラクタを持つため、Copyトレイトは実装できない
      4. その型自身が、Cloneトレイトを実装している
    • Copyトレイトを実装した主な型
      • 全てのスカラ型(bool, char, i32など)
      • 不変の参照&T型, 生ポインタ*const T 型, *mut T型(可変のa
      • 関数ポインタ型、関数定義型
      • 全要素がCopyトレイトを実装しているタプル型、配列型
      • 補足する全ての値がCopyトレイトを実装しているクロージャ
      • 何も補足していないクロージャ
      • 全ての要素がCopyトレイトを実装したOption型, Result<T, E>型
      • std::cmp::Ordering, std::net::IpAddr, Std::MARKER::pHANTOMdATA<T>型など
    • CopyとCloneの違い
      • Copyは、単純なbyteレベルのコピー。複製ロジックはカスタマイズ可能。所有権が移動する文脈で勝手に呼ばれる
      • Cloneは、複製ロジックをカスタマイズできる。明示的にcloneメソッドを呼ぶ
  • 借用
    • &をつければ借用できる(参照になる)
    • 関数の仮引数定義も、実引数で渡すときも&が必要
    • 借用チェッカによって、借用規則をチェックする
      • 借用チェッカには、2つの実装がある
        • 従来版: レキシカルスコープに基づくライフタイム推論
        • 新しい版: 通称NLL(Non-Lexical-Lifetime)。制御フローグラフに基づくライフタイム推論を行うとか
        • 現在(Edition 2018)は、NLLが使われるとのこと
課題
  • なんでCopyトレイトの実装条件に、「デストラクタがないこと」が条件なんだろう
気になったこと
  • P261の図7.2は、直前と直後の状態の図を並べないとあまり効果がない気が。。。
  • P263のサンプルコードのf2関数でコンパイルエラー。usizeに-1かけちゃダメっぽい
  • match式の「腕の中」という表現は慣れないなぁ

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

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