【问题标题】:Learning ruby, what do these snippets of code mean?学习ruby,这些代码片段是什么意思?
【发布时间】:2023-03-25 13:04:01
【问题描述】:
def winner(p1, p2)
  wins = {rock: :scissors, scissors: :paper, paper: :rock}
  {true => p1, false => p2}[wins[p1] == p2]
end

来自这个问题:HW impossibility?: "Create a rock paper scissors program in ruby WITHOUT using conditionals"

【问题讨论】:

  • 我删除了附加问题,因此帖子现在符合“每个问题一个问题”的政策。反正已经回答过很多次了。

标签: ruby


【解决方案1】:

我承认,对于新手程序员来说,这不是最易读的代码。我重写了它,提取了一些变量并添加了 cmets。希望你现在能更好地理解它。

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

【讨论】:

    【解决方案2】:

    如您所见,这是一个剪刀石头布游戏。 def 关键字开始一个方法定义。而end 表示方法结束。

    方法主体wins = {rock: :scissors, scissors: :paper, paper: :rock} 的第一行定义了一个名为wins 的散列。这是 ruby​​ 中的语法糖。您也可以将此行写入wins = { :rock => :scissors, :scissors => :paper, :paper => :rock}

    : 开头的名称在ruby 中称为符号。 Symbol 对象表示 Ruby 解释器中的常量名称和一些字符串。

    第二行的第一部分{true => p1, false => p2}也是一个哈希。而wins[p1] == p2的值可以根据第一行计算出来。例如,如果您使用winner(:paper, :rock) 调用此方法,则wins[p1] 现在是:rockwins[p1] == p2 应该是true。所以{true => p1, false => p2}[true]p1

    ruby 中方法的返回值是最后一个表达式的值。

    【讨论】:

      猜你喜欢
      • 2016-12-16
      • 1970-01-01
      • 2016-03-28
      • 1970-01-01
      相关资源
      最近更新 更多