冥冥乃志

ソフトウェア開発会社でチームマネージャをしているエンジニアの雑記。アウトプットは少なめです。

follow us in feedly

Rustの勉強(その4)

前回の続き。すこーしRust書いてる感が出てまいりましたよ。

mao-instantlife.hatenablog.com

比較とパターンマッチ

use std::cmp::Ordering;

〜中略〜

match guess.cmp(&secret_number) {
    Ordering::Less => println!("Too smal!"),
    Ordering::Greater => println!("Too big!"),
    Ordering::Equal => println!("You win!"),
}

比較は cmp メソッドで可能なようです。その結果に対してパターンマッチをしています。 Ordering::Less , Ordering::Greater , Ordering::Equal は、 use で読み込んだ型で、実態はenumです。

enum Foo {
    Bar,
    Baz,
}

各パターンの区切りはセミコロンではなくカンマのようですね。

ちなみに、チュートリアルを順に進めているとこの段階でのビルドは型変換してないので落ちます。

シャドウイング(Shadowing)と型変換

Rustではこんな書き方ができます。

let mut guess = String::new();

io::stdin().readline(&mut guess)
    .expect("Failed to read line.");

let guess: u32 = guess.trim().parse()
    .expect("Please type a number!");

標準入力から受け取った文字列を同じ変数名で32bitの数値に変換しています。Javaとか使ってると違和感が仕事をしまくるこの機能を シャドウイング(Shadowing) と呼ぶそうです。というか、まんまこういう用途(型変換して処理をしないといけないようなケース)のために作られた機能っぽいですね。シャドウイングした後の変数 guess は、その後は数値型として扱われます。

parseメソッドに型引数を指定している感じがないので、変数宣言時の型で推論してくれているようです。

ところで特に説明がないんですが、この場合文字列としての guess はどうなってしまうんでしょうか?捨てられる?機能の目的を把握していないと妙なバグを埋め込んでしまいそうな気がします。

わかっているとは思うけど

以下次号。