emahiro/b.log

Drastically Repeat Yourself !!!!

Rust で制御構文を書く

Overview

4連休なので Rust のお勉強をしてる記録です。いつまで続くかはわかりません。

ema-hiro.hatenablog.com

Rust のハンズオンを開催してもらって以降、開発できる環境を整備したりしてましたので今回は改めて制御構文について単純な Fizzbuzz を実装した内容をまとめます。

Rust の制御構文

Rust の制御構文は式なので変数にアサインすることができます。しばらく制御構文が式と評価される言語を触っていなかったので割と新鮮でした。
制御構文が式なので以下のように書くことができます。

let fizzbuss = if num % 15 == 0 {
    "FizzBuzz".to_string()
} else if num % 5 == 0 {
    "Buzz".to_string()
} else {
    "Fizz".to_string()
};
  • 式なので制御構文の中で値を必ず返します。
  • else if を使った場合は最後に必ず else をつける必要があります。

その他やったこと

Iterator で loop を実装する

Go でいうところの for 文で値を回してみます。

fn iter() {
    for num in 0..100{
        println!("{}", num)
    }
}

シンプルですね。これは index 0 から 99 までの loop を回すことができます。

コマンドライン引数を取り出してみる

シンプルな FizzBuzz を実装しただけでは面白くなかったのでコマンドライン引数を取り出して指定した値の評価する実装をします。
コマンドライン引数の取り出し方は TRPL にそのまま書かれてます。

doc.rust-jp.rs

※ 標準ライブラリの std::env ライブラリで標準入出力関連で使うライブラリなのでしばらくお世話になりそうかなと思いました。

String を Int32 に変換する

以下を参考にしました。先に変換先の型で定義した変数に対して parse と unwrap をかけるとその型に変換してくれるのスマートでいいなと思いましたね。

stackoverflow.com

実装

というわけでこんな風に実装しました。

use std::env::{self};

fn main() {
    let args: Vec<String> = env::args().collect();
    let numstr = &args[1].to_string();
    let num: i32 = numstr.parse().unwrap();
    let fizzbuss = if num % 15 == 0 {
        "FizzBuzz".to_string()
    } else if num % 5 == 0 {
        "Buzz".to_string()
    } else {
        "Fizz".to_string()
    };
    println!("{}", fizzbuss);
}

これを実行してみると以下のようになります。

cargo run 15
   Compiling rust_handson_20210716 v0.1.0 (~/src/github.com/emahiro/il/rs_sandbox/rust_handson_20210716)
    Finished dev [unoptimized + debuginfo] target(s) in 0.93s
     Running `target/debug/rust_handson_20210716 15`
FizzBuzz

まとめ

制御構文とiteratorコマンドライン引数についてざっと触ってみました。