为什么这个case语句只评估else子句?

时间:2012-07-25 15:29:29

标签: ruby switch-statement if-statement

使用Rails 3,但我猜并不重要。我把它放在模板助手中。

当我为badge-warning提供的任何价值,例如rating时,它总是转到最后一个案例rating_badge(4)

  def rating_badge(rating)
    case rating
    when rating > 3
      'badge-success'
    when rating < 3
      'badge-important'
    else
      'badge-warning'
    end
  end

出了什么问题?

3 个答案:

答案 0 :(得分:7)

您在案例陈述的顶部有一个迷路评级变量。正确的语法是:

case
when rating > 3
  'badge-success'
when rating < 3
  'badge-important'
else
  'badge-warning'
end

这对我使用pry和irb在REPL中起作用。

答案 1 :(得分:1)

我不知道case的语法,我认为你必须包含then这个词......

when something then result1
when something_else then result2
...

但您可以使用if获得相同的结果:

def rating_badge(rating)
  if rating > 3
   'badge-success'
  elsif rating < 3
    'badge-important'
  else
    'badge-warning'
  end
end

答案 2 :(得分:0)

如果您向case提供变量,它将尝试将变量的值与提供给when语句的每个值进行匹配。当您在每个when之后添加条件时,它将首先评估条件,然后将其与rating匹配。 但是,评估只会生成truefalse,并且显然您提供了case的数值,它总是会落到else的情况下(rating绝不是true也不是false)。

@CodeGnome已经发布了正确的语法,但我认为你应该知道这个失败的原因!

:)