Ruby:我可以在一个语句中多次使用“或”(||)吗?

时间:2012-09-20 15:23:17

标签: ruby

您好我正在尝试使用Ruby进行二十一点游戏并且我试图使图片卡的值全部= 10.是否可以使用我在下面使用的代码来完成此操作? (这一切都发生在我的Card班级)

def value
  if @number == ("jack" || "queen" || "king")
    10
  else
    @number.to_i
  end
end

3 个答案:

答案 0 :(得分:9)

你可以,但不是你使用它的方式。您需要在每个部分中使用整个布尔表达式:

if @number == "jack" || @number == "queen" || @number == "king"

或者你可以通过检查数组的内容来简化它:

if ["jack", "queen", "king"].include?(@number)

答案 1 :(得分:5)

parens将在其他事情之前应该评估的事情分组。所以,上面说,评估:

 ("jack" || "queen" || "king")

并返回结果。让我们在irb中尝试:

irb(main):004:0> ("jack" || "queen" || "king")
=> "jack"

由于“jack”是真的,所以不需要查看列表的其余部分并返回“jack”。

只要@number等于“jack”,这就可以正常工作,但对其他值则没那么多。您希望将@number与每个值进行比较,直到您获得匹配或耗尽列表。请参阅@PinneyM的回答

(@number == "jack") || (@number == "queen") ...

答案 2 :(得分:2)

这是一个有效的ruby代码段,但它没有按照您的想法执行:它首先评估

 ("jack" || "queen" || "king")

评估为“jack”,因为这是第一个非false / nil值。然后将@card与此进行比较,因此您的代码等同于

def value
  if @number == 'jack'
    10
  else
    @number.to_i
  end
end

您可以依次比较每个(@number == 'jack') || (@number == 'queen') ||...,您可以使用%w(jack queen king).include?(@number),也可以使用案例陈述:

def value
  case @number
  when 'jack', 'queen', 'king'
    10
  else
    @number.to_i
  end
end