(※正確な情報は公式ドキュメントを参照されたい)
| 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なら&strかString) のどちらかを保持する判別共用体。もし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>:TがCopyである必要がある。Tの実体を取得、格納する。RefCell<T>:TがCopyである必要はない。&T及び&mut T(に型強制されるラッパー型) を取得できる。UnsafeCell<T>:*mut TというTの生ポインタを扱う。名前の通りunsafe。CellやRefCellといった内部可変性をもつスマートポインタを構築するために使う。
- これを使うと、Rustの借用規則の検査をコンパイル時ではなく実行時に遅らせることができる。
- 「関数トレイト」 -
Fn(Args) -> RetはFnMut(Args) -> Retのサブタイプであり、FnMut(Args) -> RetはFnOnce(Args) -> Retのサブタイプである。Fn(Args) -> Ret: 関数の外側のスコープの変数をmoveせず、書き換えもしない関数はこのトレイトを実装する。何度でも呼び出せる。FnMut(Args) -> Ret: 関数の外側のスコープの変数をmoveしないが、書き換えるかもしれない関数はこのトレイトを実装する。何度でも呼び出せる。FnOnce(Args) -> Ret: 関数の外側のスコープの変数をmoveする関数はこのトレイトを実装する。一度しか呼び出せない。