目次

Rustの勉強[並行性 その8, RustのOOP その1]

ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる
昨日、一日虚無な時間をへてスッキリした

お勉強

#

NO IMAGESyncとSendトレイトで拡張可能な並行性 - The Rust Programming Language 日本語版
ここから初める
確か言語レベルでの平行処理の話だと思う

メモ

#
  • SendマーカートレイトSyncマーカートレイトとふたつあるらしい

Rustのほとんどの型はSendですが

  • ほう
  • んー読み進めていってもよくわからんな

Sendマーカートレイトは、Sendを実装した型を持つ値の所有権をスレッド間で転送できることを示唆します。
Syncマーカートレイトは、Syncを実装した型は、複数のスレッドから参照されても安全であることを示唆します。

  • ここか

故に、Rustの型システムとトレイト境界により、Rcの値を不安全にスレッド間で誤って送信することが絶対ないよう保証してくれるのです。

  • あれか、安全にmoveできるトレイトって感じかな
    • しくみはわからんが

Syncマーカートレイトは、Syncを実装した型は、複数のスレッドから参照されても安全であることを示唆します。
言い換えると、&T(Tへの不変参照)がSendなら、型TはSyncであり、参照が他のスレッドに安全に送信できることを意味します

  • これを初めに書いてくれ~~~

  • これをゼロから実装するのは危ないからunsafeになるかもよっていわれた

  • よしーいったん並行性終わったぞーーーー

    • 実際に実装しないとわからんな

Rustのオブジェクト指向プログラミング機能

#

NO IMAGERustのオブジェクト指向プログラミング機能 - The Rust Programming Language 日本語版

  • お、OOP
  • 最近、これ本当にあっているか?となっているやつ
  • 逆に知りたい

広くオブジェクト指向と捉えられる特定の特徴と、それらの特徴がこなれたRustでどう表現されるかを探究します

  • いいじゃん

OOP言語は特定の一般的な特徴を共有しています。
具体的には、オブジェクトやカプセル化、継承などです。
それらの個々の特徴が意味するものとRustがサポートしているかを見ましょう。

  • 継承に本当にいい思い出がない

  • トレイトなら隠蔽されすぎずにきれいに書けるんだろうか

  • お、カプセル化

カプセル化を制御する方法は、第7章で議論しました
pubキーワードを使用して、自分のコードのどのモジュールや型、関数、メソッドを公開するか決められ、既定ではそれ以外のものは全て非公開になります。

  • そうね
    • だからテストのときにprivateな関数のテストできるのすごいって話だったな
pub struct AveragedCollection {
    list: Vec<i32>,
    average: f64,
}

構造体は、他のコードが使用できるようにpubで印づけされていますが、構造体のフィールドは非公開のままです。

  • おおーなるほど
impl AveragedCollection {
    pub fn add(&mut self, value: i32) {
        self.list.push(value);
        self.update_average();
    }

    pub fn remove(&mut self) -> Option<i32> {
        let result = self.list.pop();
        match result {
            Some(value) => {
                self.update_average();
                Some(value)
            }
            None => None,
        }
    }

    pub fn average(&self) -> f64 {
        self.average
    }

    fn update_average(&mut self) {
        let total: i32 = self.list.iter().sum();
        self.average = total as f64 / self.list.len() as f64;
    }
}

値が追加されたりリストから削除される度に、平均も更新されることを保証したいので、今回の場合重要です。 addやremove、averageメソッドを構造体に実装することでこれをします。
add、remove、averageの公開メソッドが、AveragedCollectionのインスタンス内のデータにアクセスまたは変更するための、唯一の方法になります。要素がaddメソッドを使用してlistに追加されたり、removeメソッドを使用して削除されたりすると、各メソッドの実装がaverageフィールドの更新を扱う非公開のupdate_averageメソッドも呼び出します。

  • gettersetterを脳死で書くよりよほど意味のあるプログラミングだと思う

まとめ

#
  • トレイトマーカーで不変か可変の参照かを明示的にできるということが書いてあった
  • OOPを始めた
    • OOPは本当にこれできるのかという疑問があるから感動させてほしい

次はここから
NO IMAGEオブジェクト指向言語の特徴 - The Rust Programming Language 日本語版