enumとmatch構文を使ってRustに慣れ親しむ会

2021-11-21

はじめに

子供の寝付きが最近とても悪い。自由な時間が全然無いと親たちは嘆いています。 子どもたちはとても早起きなので、朝起きて自由な時間を満喫するのも中々出来ないですね。

そんな状態ですが、Rustをはじめました。

英語とかクソなので、上司からも熱いフォローがありますし、そっち頑張ったほうが、給料や昇進などを考えると良いのは間違い無いのはわかってるんですよ…。 技術文書読んだりするのも楽になるだろうし、メリットしかないのでやらない選択肢はないんですよ。 わかってるんですが、心の奥底に苦手意識みたいなものがあるんでしょうね…どうしても何かと理由を付けて後ろ回しにするんですよね。

ランニングとかダイエットも続かないような、なんというか心で負けてる。 このブログタイトルにもある「心のデブ」に屈しているとしか言いようが無い。

喋りたいってとこまでやるなら、DMM英会話とかその当たり始めたほうが良いのかしら。 まずはDuolingoとかで抑えておく?

単語も全然知らないのでとか、高校英語も怪しいので高校受験勉強をもう一度やりなおすとかは真面目に考えないといけんなとひしひしと感じています。

今日のテーマ

  • 列挙型
  • match

enumってやつと、多言語でいうところのSwitch文です。 調べてると、enumもmatch文も多言語よりも高機能そうな感じですが 今回は基礎的なところだけ抑えます。

サンプルプログラム

enum定義

定義はこんな風に書くことが出来ます。

enum Enjoyment {
    Ecstasy,
    Excitement,
    Wonder,
}

enumを使うのに適したケースってのがあります。

  • 取りうるパターンが列挙できる
  • それらが同時に選択されない

IPaddress Formatを選択したり、 サービスでいずれか一つを選択したりするようなコードを書くときに使えます。

使用するときはこんな風に、matchの条件に利用できます。

match person.state {
    Enjoyment::Ecstasy => println!("Ecstasy"),
    Enjoyment::Excitement => println!("Excitement"),
    Enjoyment::Wonder => println!("Wonder"),
}

コード全体

enum Enjoyment {
    Ecstasy,
    Excitement,
    Wonder,
}

struct PersonState {
    name: String,
    state: Enjoyment,
}

fn main() {
    let mut person = PersonState {
        name: "Kawai".to_string(),
        state: Enjoyment::Ecstasy,
    };

    println!("{}", person.name);

    match person.state {
        Enjoyment::Ecstasy => println!("Ecstasy"),
        Enjoyment::Excitement => println!("Excitement"),
        Enjoyment::Wonder => println!("Wonder"),
    }
}

実行結果

cargo run
   Compiling hello-learn v0.1.0 (E:\SourceCode\Rust\hello-learn)
warning: variable does not need to be mutable
  --> src\main.rs:18:9
   |
18 |     let mut person = PersonState {
   |         ----^^^^^^
   |         |
   |         help: remove this `mut`
   |
   = note: `#[warn(unused_mut)]` on by default

warning: variant is never constructed: `Excitement`
 --> src\main.rs:3:5
  |
3 |     Excitement,
  |     ^^^^^^^^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: variant is never constructed: `Wonder`
 --> src\main.rs:4:5
  |
4 |     Wonder,
  |     ^^^^^^

warning: trait method `getName` should have a snake case name
 --> src\main.rs:8:8
  |
8 |     fn getName(&mut self) -> std::string::String;
  |        ^^^^^^^ help: convert the identifier to snake case: `get_name`
PS E:\SourceCode\Rust\hello-learn> cargo run
warning: variable does not need to be mutable      
  --> src\main.rs:18:9
   |
18 |     let mut person = PersonState {
   |         ----^^^^^^
   |         |
   |         help: remove this `mut`
   |
   = note: `#[warn(unused_mut)]` on by default     

warning: variant is never constructed: `Excitement`
 --> src\main.rs:3:5
  |
3 |     Excitement,
  |     ^^^^^^^^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: variant is never constructed: `Wonder`
 --> src\main.rs:4:5
  |
4 |     Wonder,
  |     ^^^^^^

warning: trait method `getName` should have a snake case name
 --> src\main.rs:8:8
  |
8 |     fn getName(&mut self) -> std::string::String;
  |        ^^^^^^^ help: convert the identifier to snake case: `get_name`
PS E:\SourceCode\Rust\hello-learn> cargo run
warning: variable does not need to be mutable      
  --> src\main.rs:18:9
   |
18 |     let mut person = PersonState {
   |         ----^^^^^^
   |         |
   |         help: remove this `mut`
   |
   = note: `#[warn(unused_mut)]` on by default     

warning: variant is never constructed: `Excitement`
 --> src\main.rs:3:5
  |
3 |     Excitement,
  |     ^^^^^^^^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: variant is never constructed: `Wonder`
 --> src\main.rs:4:5
  |
4 |     Wonder,
  |     ^^^^^^

warning: trait method `getName` should have a snake case name
 --> src\main.rs:8:8
  |
8 |     fn getName(&mut self) -> std::string::String;
  |        ^^^^^^^ help: convert the identifier to snake case: `get_name`
  |
  = note: `#[warn(non_snake_case)]` on by default

warning: trait method `getState` should have a snake case name
 --> src\main.rs:9:8
  |
9 |     fn getState(&mut self);
  |        ^^^^^^^^ help: convert the identifier to snake case: `get_state`

warning: 5 warnings emitted

    Finished dev [unoptimized + debuginfo] target(s) in 0.04s
     Running `target\debug\hello-learn.exe`
Kawai
Ecstasy
PS E:\SourceCode\Rust\hello-learn>

まとめ

基礎文法を抑えてます。 次回以降もやっていきましょう。

なんとなく書き方はC++に近い気もするのですが、警告やErrorが親切ですよね。 というか書き方がC++は結構ガバガバな印象だったのですが、Rustはそれよりも厳格なような うまく言葉が見つからないですが、もう少し触れてみましょう。