目次
前回の記事はこちら。自分用のメモなので、読みにくいかもです。
- Rust the Bookを読み始めた
- Rust the book - 第4章
- Rust the book - 第5章
- Rust the book - 第6章
- Rust the book - 第8章
- Rust the book - 第9章
- Rust the book - 第10章
- Rust the book - 第13章
14章は飛ばして、15章です(Cargoはまた別途調べればいいかな?と思って)。
第15章 スマートポインタ
たぶん、これを理解すれば、参照とベクタや構造体とかの組み合わせがもう少し効率よく使えるようになるのかなぁ?
- ポインタの強い版?
- 参照カウント方式のスマートポインタ型 - Luceneとかで実装されてた気がするなぁ
- 複数の所有者!?
- 参照カウント方式のスマートポインタ型 - Luceneとかで実装されてた気がするなぁ
- DerefとDropトレイトを実装している構造体
ヒープのデータを指すBoxを使用する
これはコンパイルエラー。let y
のタイミングで借用してるので、書き換えでエラーになる。
fn main() {
let mut x = 5;
let y = &x;
assert_eq!(5, x);
assert_eq!(5, *y);
x = 6;
assert_eq!(6, x);
assert_eq!(6, *y);
}
こっちはOK。
fn main() {
let mut x = 5; // in stack
let y = Box::new(x); // in heap
assert_eq!(5, x);
assert_eq!(5, *y);
x = 6;
assert_eq!(6, x);
assert_eq!(6, *y);
}
余談:コンパイラが変なワーニングを出してくれた。
use std::ops::Deref;
impl<T, Z> Deref for MyBox<T, Z> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
struct MyBox<T, Z>(T, Z);
impl<T, Z> MyBox<T, Z> {
fn new(x: T, y: Z) -> MyBox<T, Z> {
MyBox(x, y)
}
}
fn main() {
let x = 5;
let z = "10";
let y = MyBox::new(x, z);
assert_eq!(5, x);
assert_eq!(5, *y);
}
Derefトレイトでスマートポインタを普通の参照のように扱う
参照外し型強制
: 日本語ムズカシイネ- Derefを自分で実装しないといけない場面がちょっと想像できてない。たぶん、Boxとかの説明に必要なので出てきたって感じなんだろうけど。
Dropトレイトで片付け時にコードを走らせる
- こっちは、リソース開放とかでいい感じにできそうだってのはわかった。
- Dropはどんなときに実装するんだろう?Tantivyだとオブジェクトプールとかで使ってた。
Rcは、参照カウント方式のスマートポインタ
- これ、ここで作ったConsのリストを追っかけるためのサンプルも書いてほしい。
#[derive(Debug)]
enum List {
Cons(i32, Rc<List>),
Nil,
}
fn print_typename<T>(_: T) {
println!("{}", std::any::type_name::<T>());
}
use List::{Cons, Nil};
use std::rc::Rc;
use std::borrow::Borrow;
fn main() {
let z = Cons(5, Rc::new(Cons(10, Rc::new(Nil))));
let a = Rc::new(z);
let _b = Cons(3, Rc::clone(&a));
let _c = Cons(4, Rc::clone(&a));
match &(*a) {
Cons(v1, v2) => {
print_typename(v2);
println!("{}, {:?}", v1, v2);
},
Nil => println!("Nil!!")
};
}
RefCellと内部可変性パターン
循環参照は、メモリをリークすることもある
comments powered by Disqus
See Also by Hugo
- Rust the book - 第13章
- Rust the book - 第9章
- Rust the book - 第10章
- Rust the book - 第8章
- Rust the book - 第6章