嗨,我正在尝试使用 Ruby 制作二十一点游戏,并尝试使图片卡的值全部 = 10。可以使用我在下面使用的代码来完成此操作吗?(这一切都发生在我的Card
课堂上)
def value
if @number == ("jack" || "queen" || "king")
10
else
@number.to_i
end
end
嗨,我正在尝试使用 Ruby 制作二十一点游戏,并尝试使图片卡的值全部 = 10。可以使用我在下面使用的代码来完成此操作吗?(这一切都发生在我的Card
课堂上)
def value
if @number == ("jack" || "queen" || "king")
10
else
@number.to_i
end
end
你可以,但不是你使用它的方式。您要么需要在每个部分中使用整个布尔表达式:
if @number == "jack" || @number == "queen" || @number == "king"
或者您可以通过检查数组的内容来使其更简单:
if ["jack", "queen", "king"].include?(@number)
括号将应在其他事物之前评估的事物分组。所以,上面说,评估:
("jack" || "queen" || "king")
并返回结果。让我们在 irb 中尝试一下:
irb(main):004:0> ("jack" || "queen" || "king")
=> "jack"
由于“jack”是真实的,因此无需查看列表的其余部分并返回“jack”。
只要@number 等于“jack”,这将正常工作,但对于其他值则不然。您希望将 @number 与每个值进行比较,直到获得匹配项或用完列表。请参阅@PinneyM 的回答
(@number == "jack") || (@number == "queen") ...
这是一个有效的 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)
或者你可以使用 case 语句:
def value
case @number
when 'jack', 'queen', 'king'
10
else
@number.to_i
end
end