1

两个类似的脚本在这里显示出非常奇怪的行为。

A)下面的代码抛出一个nil can't be coerced into Fixnum (TypeError)

    score = 0
    ammount = 4

    score += case ammount
      when ammount >= 3; 10
      when ammount < 3; 1
    end

    puts score

B)另一个正在放入1控制台日志。

    score = 0
    ammount = 4

    score += case ammount
      when ammount >= 3; 10
      else 1
    end

    puts score

我希望这两个脚本都能输出10到控制台。我错了吗?为什么?

4

3 回答 3

5

当给定一个参数时, case 语句检查对象是否相等(与调用相同===),它可以用于单个值或超出范围。在您的情况下,您并没有真正检查是否相等,但可以这样写:

score += case
         when amount >= 3 then 10
         when amount < 3 then 1
         end

但是,这对于您要尝试做的事情(一个非此即彼的条件)来说非常冗长。使用普通if...else或三元语句更简单:

score += amount >= 3 ? 10 : 1
于 2012-11-09T23:13:27.693 回答
1

您正在混合两种类型的 case 语句:

  1. case variable
    when range/expression then ...
    else statement
    end
    
  2. case
    when case1 then ...
    else ...
    end
    

问题:

为什么你的代码不起作用?

回答:

当您在 中指定变量时,将对每个测试应用case隐式操作。在您的情况下,是 4,并且大于 3,然后 amount>=3 是,所以第一个 when 将测试 if 。显然不是,所以它会转到下一个,下一个是并且它也不为假,所以 case 语句将返回,然后你会得到一个错误说。===whenamounttrueamount === truefalsenilnil class cannot be coerced

你的第二个条件也是如此。

正确的解决方案是使用上述之一:

任何一个:

score = 0
ammount = 4

score += case
  when ammount >= 3; 10
  when ammount < 3; 1
end

或者:

score = 0
ammount = 4

score += case ammount
  when 3..(1.0/0.0); 10
  when -(1.0/0.0)...3; 1
end
于 2012-11-09T23:21:53.963 回答
0

您应该使用 'then' 而不是 ';' 在案例内部并且不为案例声明 ammount 变量,只需使用您在那里的子句。使用三元运算更容易获得您想要的结果:

score += ammount >= 3 ? 10 : 1
于 2012-11-09T23:17:39.537 回答