def winner(p1, p2)
wins = {rock: :scissors, scissors: :paper, paper: :rock}
{true => p1, false => p2}[wins[p1] == p2]
end
2 に答える
確かに、これは初心者プログラマーにとって最も読みやすいコードではありません。私はそれを書き直し、いくつかの変数を抽出し、コメントを追加しました。あなたが今それをよりよく理解できることを願っています。
def winner(p1, p2)
# rules of dominance, who wins over who
wins = {
rock: :scissors,
scissors: :paper,
paper: :rock
}
# this hash is here to bypass restriction on using conditional operators
# without it, the code would probably look like
# if condition
# p1
# else
# p2
# end
answers = {
true => p1,
false => p2
}
# given the choice of first player, which element can he beat?
element_dominated_by_first_player = wins[p1]
# did the second player select the element that first player can beat?
did_player_one_win = element_dominated_by_first_player == p2
# pick a winner from our answers hash
answers[did_player_one_win]
end
winner(:rock, :scissors) # => :rock
winner(:rock, :paper) # => :paper
winner(:scissors, :paper) # => :scissors
ご覧のようにじゃんけんゲームです。def
キーワードはメソッド定義を開始します。そしてend
、メソッドの終わりを意味します。
メソッド本体の最初の行は、wins = {rock: :scissors, scissors: :paper, paper: :rock}
と呼ばれるハッシュを定義しますwins
。これはルビーのシンタックスシュガーです。この行をに書き込むこともできますwins = { :rock => :scissors, :scissors => :paper, :paper => :rock}
。
aで始まる名前:
は、ルビーではシンボルと呼ばれます。シンボルオブジェクトは、Rubyインタープリター内の定数名といくつかの文字列を表します。
2行目の最初の部分{true => p1, false => p2}
もハッシュです。そして、の値はwins[p1] == p2
最初の行に従って計算できます。たとえば、このメソッドを、で呼び出すとwinner(:paper, :rock)
、wins[p1]
は:rock
現在およびwins[p1] == p2
である必要がありますtrue
。です。{true => p1, false => p2}[true]
_p1
rubyのメソッドの戻り値は、最後の式の値です。