Ruby switch语句始终计算为默认值

时间:2015-07-14 15:23:02

标签: ruby

如果我按如下方式模拟六面模具的滚动,它总是评估为6.如何解决这个问题?

def rolldice()
  roll = rand()
  case roll
    when 0..(1/6) then return 1
    when (1/6)..(2/6) then return 2
    when (2/6)..(3/6) then return 3
    when (3/6)..(4/6) then return 4
    when (4/6)..(5/6) then return 5
    else return 6
  end
end

die1 = rolldice()
puts die1

4 个答案:

答案 0 :(得分:5)

这是因为1/60。您只需将范围传递给rand

即可
def rolldice
  rand(1..6)
end

答案 1 :(得分:1)

当你除以两个整数时,结果将是一个整数,所以你的代码实际上是这样做的:

when 0..0 then return 1
when 0..0 then return 2
when 0..0 then return 3
when 0..0 then return 4
when 0..0 then return 5
else return 6

在IRB中尝试这个简单的例子:

1 / 6
=> 0

答案 2 :(得分:1)

Stefan是对的,但答案并没有清楚地解释你的问题。

问题是rand()给你一个Float(可以在小数点后面有数字)。

但是在case声明中,您使用的是0..(1/6)

等范围

问题是(1/6)中的数字都是整数,所以答案是整数。这就是为什么(1/6)0,它是四舍五入的。

您也可以使用when范围来解决问题,例如:

when (3.0/6)..(4.0/6) then return 4

查看(3.0/6)我们有一个Float除以整数,结果是一个Float,在本例中为0.5

但最终可能最好遵循斯特凡的建议。我们可以使用范围,而不是将rand用于从01的浮点数。一些选择:

rand(1..6)    # Returns an Integer from 1 to 6
rand(6)   # Returns an Integer from 0 to 5

如果您使用第一种情况,那么您可以将时间重写为when 5 ...等等。在这种情况下,因为你想要的只是返回数字,你甚至不需要case语句,因此Stefan更简单的回答是直接调用rand并使用该值。

答案 3 :(得分:0)

案例声明不是您的最佳选择。它可能最适合文本或修复值。假设您正在进行RPG应用程序, Switch 可能更有用,可以选择如何处理武器/装甲。

Case 是一种更优雅的方式来编写很多if elses,但表现方式几乎相同。在编写 Case 之前,您应该使用irb(或rails控制台,如果您愿意)测试条件。这使事情变得更容易。

Case也做了很多比较,在这个特殊情况下它们没有必要,使用rand()直接表现会更好,代码也会更简单。请注意,rand(6)将从0返回到5,只是总和1以获得d6。

def rolldice
   return rand(6)+1
end