所有権と借用
Rust Smart Pointers: Box and Rc
Put data on the heap with Box and share one value between several owners with Rc.
学べること
- Box<T> for recursive types
- Rc<T> for shared ownership
- Rc::strong_count
A list built with Box
- 1
Node(1)points to - 2
Node(2)points to - 3
Node(3)points to - 4
Endsum = 6
Pointers that own their data
A smart pointer owns the data it points to. Box<T> stores a value on the heap, which makes recursive types possible. Rc<T> lets several owners share one value by counting them.
List contains itself, so its size would be infinite without Box: a Box has a fixed size because it is only a pointer. Rc::clone does not copy the string, it adds an owner, and strong_count shows three owners. The value is freed when the last owner is gone.
重要なポイント
- Box has a fixed size, so a type can contain itself.
Rc::cloneadds an owner, it does not copy the data.- The value is freed when the last owner is gone.
実行できる Rust のサンプル
Rust
main.rs
use std::rc::Rc;
enum List {
Node(i32, Box<List>),
End,
}
fn sum(list: &List) -> i32 {
match list {
List::Node(value, next) => value + sum(next),
List::End => 0,
}
}
fn main() {
let list = List::Node(1, Box::new(List::Node(2, Box::new(List::Node(3, Box::new(List::End))))));
println!("sum = {}", sum(&list));
let shared = Rc::new(String::from("shared config"));
let reader_a = Rc::clone(&shared);
let reader_b = Rc::clone(&shared);
println!("{reader_a} / {reader_b}");
println!("owners: {}", Rc::strong_count(&shared));
}
sum = 6
shared config / shared config
owners: 3練習
サンプルをオンラインコンパイラーで開き、値を変えたり行を追加したりして、実行する前に出力を予想してみましょう。次に、わざとコードを壊してコンパイラーのメッセージを読んでみてください。
このレッスンを終えましたか?
学習済みにすると進み具合を記録できます。
進み具合はこのブラウザーに保存されています ログインすると、どのデバイスでも引き継げます。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
すべてのチャレンジ