2
def winner(p1, p2)
  wins = {rock: :scissors, scissors: :paper, paper: :rock}
  {true => p1, false => p2}[wins[p1] == p2]
end

この質問から:HW不可能?:「条件を使用せずにルビーでじゃんけんプログラムを作成する」

4

2 に答える 2

6

確かに、これは初心者プログラマーにとって最も読みやすいコードではありません。私はそれを書き直し、いくつかの変数を抽出し、コメントを追加しました。あなたが今それをよりよく理解できることを願っています。

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
于 2012-10-09T09:33:50.570 に答える
1

ご覧のようにじゃんけんゲームです。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のメソッドの戻り値は、最後の式の値です。

于 2012-10-09T09:36:34.647 に答える