Rust the book - 第15章

Posted by johtani on Thursday, July 9, 2020

目次

前回の記事はこちら。自分用のメモなので、読みにくいかもです。

14章は飛ばして、15章です(Cargoはまた別途調べればいいかな?と思って)。

第15章 スマートポインタ

たぶん、これを理解すれば、参照とベクタや構造体とかの組み合わせがもう少し効率よく使えるようになるのかなぁ?

  • ポインタの強い版?
    • 参照カウント方式のスマートポインタ型 - 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


Related by prelims-cli