2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Re:ゼロから始めて rust を完全に理解する その2

Posted at

ここを見て0からrustを勉強し始めた

https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/README.html
↑古かった
↓こっちが新しい
https://doc.rust-jp.rs/book/second-edition/ch02-00-guessing-game-tutorial.html

前回 の続きからソースを見ていく

extern crate rand;

use std::io;
use std::cmp::Ordering;
use rand::Rng;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1, 101);

    loop {
        println!("Please input your guess.");

        let mut guess = String::new();

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

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("You guessed: {}", guess);

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

.expect(...) の部分、read_lineの戻り値がResult型でenum でOkかErrが返ってくる。
Errが返ってきた場合、expectでプログラムをクラッシュさせて、文字列を表示する。
expectを付けないでコンパイルした場合、Errが返ってくる可能性に対してハンドルしてないよ!!の警告を食らう、rustの世界厳しいっすね。

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

let guess: u32 = ... guess変数をunsigned 32bit 数値型で再定義している。
入れる内容は、read_lineで読み取った文字列型のguessを数値型にparseで変換をかける。
parseの戻り値もResult型なので、Errに対するハンドルをしないとワーニングがでてしまう。
matchを使って戻り値判定を行い、返ってきたEnumの列挙型ごとに処理を分岐させる。
Err(_)の場合、_は包括値で全てのエラーにマッチするらしい、他での応用も含めてもう少し調査が必要、ひとまずは文字列⇒数値へのパースに失敗したらcontiune。

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

最初に定義した乱数secret_numberをcmpに借用で渡す、戻り値がEnum型なのでmatchで判定して処理分岐。ここは直感的に理解できるな。

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

まずはここまで完全に理解した。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?