if文なしでじゃんけん Rust編


if文なしでじゃんけん を見て コメント にもあるようにむしろifよりmatchの方が表現力が高いのでは!?と感じたのでmatchも抜いてRustで作ってみました。
※ ちなみにタイトルは元記事に合わせただけでRustではif式とmatch式になります。

コード

main.rs
use std::collections::HashMap;

#[derive(Clone, Copy, PartialEq, Eq, Hash)]
enum RPS {
    Rock,
    Paper,
    Scissors,
}

use RPS::*;

fn main() {

    let emoji_lut = vec![
        (Rock, '✊'),
        (Paper, '🖐'),
        (Scissors, '✌'),
    ].into_iter().collect::<HashMap<RPS, char>>();

    let text_lut = vec![
        ([Rock, Paper], "あなたの負け"),
        ([Rock, Scissors], "あなたの勝ち"),
        ([Paper, Rock], "あなたの勝ち"),
        ([Paper, Scissors], "あなたの負け"),
        ([Scissors, Paper], "あなたの勝ち"),
        ([Scissors, Rock], "あなたの負け"),
    ].into_iter().collect::<HashMap<[RPS; 2], &str>>();

    let hands = &[Rock, Scissors, Paper];
    for me in hands {
        for you in hands {
            println!(
                "[{} vs {}] {}",
                emoji_lut[me],
                emoji_lut[you],
                (me == you).then(|| &"あいこ").or_else(|| text_lut.get(&[*me, *you])).unwrap()
            );
        }
    }
}

Rust Playground

あいこのパターンを3つ減らすために事前に精査しています。
Rustは型システムが堅実で柔軟なので、条件文なしで綺麗に書けました。

まとめ

他にも初めからじゃんけんを数値として扱ったり enum RPS を数値に変換して計算すれば、今回書いた text_lut のように網羅的にパターンを書く必要がなくなります。
ですが、今回のenumでは型が付いてくるので元記事の文字列で扱ったり、前述した方法より個人的に好きです。

知識や記述の間違いがあればご指摘いただけれると嬉しいです。