コンテンツにスキップ

制御構文

はじめに

本サイトにつきまして、【IT技術の知見】はじめに - 俺の技術ノート をご認識のほど宜しくお願いいたします。


01. パターンマッチ

match による列挙型の分岐

match は強化版の switch であり、バリアントのなかのフィールドをその場で変数として取り出せる。

すべてのケースを網羅しないとコンパイルエラーになるため、分岐の書き忘れを防げる。

match cli.command {
    // Login バリアントのフィールドを変数として取り出す
    Command::Login { url, no_browser, port, timeout } => { /* ... */ }
    // Token バリアントの url を取り出す
    Command::Token { url } => { /* ... */ }
    // 1 つでもバリアントの分岐が欠けると、コンパイルエラーになる
    Command::Organizations { url } => { /* ... */ }
}


値によるマッチ

パターンには 403 のような具体的な値を書け、上から順に評価される。

そのため、具体的なパターンを先に書き、status や err のようにすべてを受け取るパターンを後に書く。

match ureq::get(&url).call() {
    // 成功したときのレスポンスを取り出す
    Ok(mut response) => { /* ... */ }
    // ステータスコードが 403 のときだけマッチする
    Err(ureq::Error::StatusCode(403)) => bail!("invalid token"),
    // 403 以外のステータスコードを status に代入する
    Err(ureq::Error::StatusCode(status)) => bail!("returned {status}"),
    // 上記以外の全てのエラーを err に代入する
    Err(err) => Err(err).context("failed to request"),
}


02. if 式

Rust の if は式であり、値を返せるため三項演算子の代わりになる。

'*' のようにシングルクォートで囲むと char 型 (1 文字) になり、ダブルクォートで囲むと文字列になる。

// current が true なら '*'、false なら ' ' を marker に代入する
let marker = if organization.current { '*' } else { ' ' };