簡體   English   中英

學習紅寶石,這些代碼片段是什么意思?

[英]Learning ruby, what do these snippets of code mean?

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

來自這個問題: 硬件不可能嗎?:“不用條件就可以在紅寶石中創建剪刀石頭布程序”

我承認,對於初學者來說,這不是最易讀的代碼。 我重寫了它,提取了一些變量並添加了注釋。 希望您現在能更好地理解它。

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的哈希。 這是ruby中的語法糖。 您也可以將此行寫成wins = { :rock => :scissors, :scissors => :paper, :paper => :rock}

:開頭的名稱在紅寶石中稱為符號。 符號對象代表常量名稱和Ruby解釋器中的一些字符串。

第二行的第一部分{true => p1, false => p2}也是一個哈希。 可以根據第一行計算wins[p1] == p2的值。 例如,如果使用winner(:paper, :rock)調用此方法,則wins[p1]現在是:rock並且wins[p1] == p2應該為true 因此{true => p1, false => p2}[true]p1

紅寶石中方法的返回值是最后一個表達式的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM