Skip to content

Instantly share code, notes, and snippets.

@KisaragiEffective
Created May 4, 2023 04:30
Show Gist options
  • Save KisaragiEffective/cdb73bf955ea4ce3ee0977df0aac3d15 to your computer and use it in GitHub Desktop.
Save KisaragiEffective/cdb73bf955ea4ce3ee0977df0aac3d15 to your computer and use it in GitHub Desktop.

(※正確な情報は公式ドキュメントを参照されたい)

Borrowed Owned Ownedは可変長? 説明
&str String Yes 文字列型。UTF-8であることが保証されている。
&[T] Vec<T> Yes 並んだ型。大体配列。
&OsStr OsString Yes 文字列型。OS依存のエンコーディング。
&Path PathBuf Yes ファイルのパス。
Non-borrowed Borrowed 説明
[T; N] &[T; N] 固定長の配列。&[T; N]&[T]へ暗黙に変換される。
T &T ただの参照。所有権を奪わない。
T &mut T 書き換え可能な参照。やはり所有権を奪わない。

スマートポインタ

  • Cow<'a, T>: &'a T<T as ToOwned>::ToOwned (例: T=str なら &strString) のどちらかを保持する判別共用体。もしOwnedが必要な場合はToOwnedを呼ぶ必要がある。
  • Box<T>: ヒープにTを確保する。それだけである。あまり出番はない。
    • 使う必要がある例:
      • コンスリストのように、自身の型を再帰的に含む場合
      • Sizedトレイトを実装しない型をライフタイムなしに持たせたい場合
  • Rc<T>: 参照カウンタ。カウントがゼロになるとTを解放する。
    • Weak<T>: Rc<T>から作ることができる弱参照。
  • Arc<T>: アトミックな参照カウンタ。スレッドをまたいで使える。
  • Mutex<T>: ミューテックス。
  • Atomic{I,U}{8,16,32,64,size}: アトミックな読み書きが保証されている整数。Mutexよりもパフォーマンスがいいとされる。
  • NonNull<T>: ヌルポインタではない*mut T
  • once_cellクレート内のもの (syncとunsyncの差はシングルスレッド版かどうか):
    • once_cell::{sync,unsync}::Lazy<T>: コンストラクタに初期化関数を渡すと、初めて参照されたときに初期化を行う。
    • once_cell::{sync,unsync}::OnceCell<T>: 一度だけ書き込めるスマートポインタ。
  • 内部可変性
    • これを使うと、Rustの借用規則の検査をコンパイル時ではなく実行時に遅らせることができる。
      • これは借用規則を無視できるものではない; 借用規則を無視した場合、良くて実行時エラー、最悪の場合は未定義動作となる。
      • -> それによって、一部のフィールドのみ書き換えたいなどの要求を実現することができる。
    • Cell<T>: TCopyである必要がある。Tの実体を取得、格納する。
    • RefCell<T>: TCopyである必要はない。&T及び&mut T (に型強制されるラッパー型) を取得できる。
    • UnsafeCell<T>: *mut TというT生ポインタを扱う。名前の通りunsafeCellRefCellといった内部可変性をもつスマートポインタを構築するために使う。

その他

  • 「関数トレイト」 - Fn(Args) -> RetFnMut(Args) -> Retのサブタイプであり、FnMut(Args) -> RetFnOnce(Args) -> Retのサブタイプである。
    • Fn(Args) -> Ret: 関数の外側のスコープの変数をmoveせず、書き換えもしない関数はこのトレイトを実装する。何度でも呼び出せる。
    • FnMut(Args) -> Ret: 関数の外側のスコープの変数をmoveしないが、書き換えるかもしれない関数はこのトレイトを実装する。何度でも呼び出せる。
    • FnOnce(Args) -> Ret: 関数の外側のスコープの変数をmoveする関数はこのトレイトを実装する。一度しか呼び出せない。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment