Rust 基礎からマスターまで — 第8回
Box、Rc、Arcで所有構造を選択する
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
ほとんどの値はローカル変数とコレクションだけで所有できます。 ヒープに固定したり、複数の所有者が共有する必要がある場合は、目的に合ったスマートポインタを選択します。
Box
enum Node {
Value(i32, Box<Node>),
End,
}
let list = Node::Value(
10,
Box::new(Node::Value(20, Box::new(Node::End))),
);
再帰型は、次の値のサイズをコンパイルするとすぐにはわかりません。 Boxは値をヒープに入れ、現在の型には固定サイズのポインタを格納します。
Boxと自動的に共有されるわけではなく、基本所有者はまだ1つです。
RcとArc
use std::rc::Rc;
let data = Rc::new(String::from("ItemTable"));
let ui_data = Rc::clone(&data);
let game_data = Rc::clone(&data);
Rcは、単一スレッドで同じ値を複数の場所に所有させます。 最後のRcが消えると値がクリーンアップされます。
複数のスレッドで共有するには、アトミック参照数を使用するArcが必要です。 RcとArcは基本的に内部値を変更可能にしません。
内部可変性
use std::cell::RefCell;
use std::rc::Rc;
let score = Rc::new(RefCell::new(0));
*score.borrow_mut() += 10;
RefCellは借りる規則をコンパイル時間ではなく実行時間にチェックします。 同時に、間違って借りるとプログラムがパニックになるので、コンパイルチェックが消えたわけではありません。
スレッド間では通常、ArcとMutexを組み合わせて変更アプローチを同期させる。
スマートポインタをたくさん重ねると所有構造を理解しにくくなる。 Boxは単独ヒープ所有、Rcはシングルスレッド共有、Arcはスレッド間共有という目的から確認し、最も単純なタイプを選択しなければならない。