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()
);
}
}
}
あいこのパターンを3つ減らすために事前に精査しています。
Rustは型システムが堅実で柔軟なので、条件文なしで綺麗に書けました。
まとめ
他にも初めからじゃんけんを数値として扱ったり enum RPS
を数値に変換して計算すれば、今回書いた text_lut
のように網羅的にパターンを書く必要がなくなります。
ですが、今回のenumでは型が付いてくるので元記事の文字列で扱ったり、前述した方法より個人的に好きです。
知識や記述の間違いがあればご指摘いただけれると嬉しいです。