2
1

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 3 years have passed since last update.

列挙型

Last updated at Posted at 2020-03-05

#enum
列挙型とは、複数の変数の内、どれか一つをとるデータ型です。
enumの中身によって処理を分岐させるmatch演算子もセットで覚えましょう。

// プログラミング言語の選択肢
enum Language {
    Rust,
    C,
    VBA,
    Python,
    Haskell,
    LISP,
}

fn main(){
    let my_language = Language::Rust; // Rustを選択する。

    // これはmatch構文。
    // my_languageの値によって異なる文字列を返す。
    let output = match my_language {
        Language::Rust      => "Rustは私が勉強しているプログラミング言語です。",
        Language::C         => "Cは以前使ったことがあるプログラミング言語です。",
        Language::Python    => "Pythonはとても便利だという噂だが、私は電卓以外の用途で使ったことがありません。",
        _                   => "その言語はよくわかりません",
    };

    println!("{}", output); // "Rustは私が勉強しているプログラミング言語です。"が表示される。
}

列挙型の定義は以下のように書きます。
enum 列挙体の名前 { ヴァリアント }
ヴァリアントはカンマで区切って複数回書くことが出来ます。

#match
上記コードのこの部分に注目してください。

// これはmatch構文。
// my_languageの値によって異なる文字列を返す。
let output = match my_language {
    Language::Rust      => "Rustは私が勉強しているプログラミング言語です。",
    Language::C         => "Cは以前使ったことがあるプログラミング言語です。",
    Language::Python    => "Pythonはとても便利だという噂だが、私は電卓以外の方法で使ったことがありません。",
    _                   => "その言語はよくわかりません",
};

ここでmatch演算子を使って処理を分岐させています。
Language::Rustの場合、Language::Cの場合・・・と順番にmy_languageとマッチするか判定し、マッチしたら=>の右側に書かれているコードを実行します。
matchは式なので、値を返します。関数と同じように、最後に書かれた式やデータが戻り値となります。
まとめると、my_languageの中身によって異なる文字列をoutputに束縛するコードということになります。
matchは以下のように書きます。
match 分岐の判定に使うデータ {
パターン => マッチした場合のコード
パターン => マッチした場合のコード
・・・
}
パターンとコードの組(アームといいます)はいくつあっても良いのですが、すべてのパターンを網羅する必要があります。
そのため、すべてのパターンを列挙するか、あらゆるデータにマッチするパターンを末尾に書かなければいけません。

目次

2
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?