目次

Rustの勉強[RustのOOP その3 & パターンとマッチング その1]

ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる

お勉強

#

NO IMAGEオブジェクト指向デザインパターンを実装する - The Rust Programming Language 日本語版

  • ここやる

メモ

#
impl DraftPost {
    // --snip--
    pub fn request_review(self) -> PendingReviewPost {
        PendingReviewPost {
            content: self.content,
        }
    }
}

pub struct PendingReviewPost {
    content: String,
}

impl PendingReviewPost {
    pub fn approve(self) -> Post {
        Post {
            content: self.content,
        }
    }
}
  • んー?なんか複雑になってないか?
    • あ、いや違うか
    • Postのインスタンスを作るためにはapproveを経由する必要があるわけね
    • 理解理解
use blog::Post;

fn main() {
    let mut post = Post::new();

    post.add_text("I ate a salad for lunch today");

    let post = post.request_review();

    let post = post.approve();

    assert_eq!("I ate a salad for lunch today", post.content());
}

postを再代入するためにmainに行う必要のあった変更は、この実装がもう、 全くオブジェクト指向のステートパターンに沿っていないことを意味します: 状態間の変形は最早、Post実装内に完全にカプセル化されていません。

  • でもこの実装いいじゃん

型システムとコンパイル時に起きる型チェックのおかげでもう無効な状態があり得なくなりました。

  • うーん、いいのかもしれないけどRust特有で怖いな

オブジェクト指向パターンは、 必ずしもRustの強みを活かす最善の方法にはなりませんが、利用可能な選択肢の1つではあります。

  • まーこれがすべてだよな

NO IMAGEパターンとマッチング - The Rust Programming Language 日本語版

  • 別の章にきました
match VALUE {
PATTERN => EXPRESSION,
PATTERN => EXPRESSION,
PATTERN => EXPRESSION,
}

match式の必須事項の1つは、match式の値の可能性全てが考慮されなければならないという意味で網羅的である必要があることです。

  • これやったな

    • だから漏れがないとも言えると
    • _を利用するとスキップできてしまうので
  • if letもやったな

    • オレかオレ以外のマッチングパターン
fn main() {
let favorite*color: Option<&str> = None;
let is_tuesday = false;
let age: Result<u8, *> = "34".parse();

    if let Some(color) = favorite_color {
        // あなたのお気に入りの色、{}を背景色に使用します
        println!("Using your favorite color, {}, as the background", color);
    } else if is_tuesday {
        // 火曜日は緑の日!
        println!("Tuesday is green day!");
    } else if let Ok(age) = age {
        if age > 30 {
            // 紫を背景色に使用します
            println!("Using purple as the background color");
        } else {
            // オレンジを背景色に使用します
            println!("Using orange as the background color");
        }
    } else {
        // 青を背景色に使用します
        println!("Using blue as the background color");
    }

}
  • なにこれ
    • 絶対にもっといい書き方あるだろ

if let式を使うことの欠点は、コンパイラが網羅性を確認してくれないことです。

  • なのでオレかオレ以外かでしか使わないほうがいい認識

  • while let

    • うーん、これもループ書きたくないとき用かな

whileループはpopSomeを返す限り、ブロックのコードを実行し続けます。 popNoneを返すと、ループは停止します。while letを使用してスタックから全ての要素を取り出せるのです

  • いちおう最後まで見てくれるのか
    • いいかもね
let v = vec!['a', 'b', 'c'];

for (index, value) in v.iter().enumerate() {
println!("{} is at index {}", value, index);
}
  • ほーん、indexvalueが取れるんだ
    • こういう言語意外とない気がする

まとめ

#
  • OOPはなんか学んだという感じはしなかった

  • マッチパターンはおもしろい

  • while letはどこかで使えそう

  • 次はletから

NO IMAGEパターンが使用されることのある箇所全部 - The Rust Programming Language 日本語版