为什么这个switch语句不起作用?

时间:2017-01-17 22:45:25

标签: ruby ruby-2.3

我有这段代码

(1..50).each do |num|
    case num
      when num % 4 == 0, num % 6 == 0
        puts 'Cluck'
      when num % 4 == 0
        puts 'Cluck Cluck'
      when num % 5 == 0
        puts 'Cluck Cluck Cluck'
      else
        puts num
    end
end    

由于一些奇怪的原因,它不是把第二线上的咯咯咯咯或第24行的咯咯,而是只是列出1到100的列表。我无法弄清楚是什么'错误的switch语句。第一个使用逗号或&&也没有改变任何东西(我不相信它应该)。

3 个答案:

答案 0 :(得分:3)

问题

情况a时b

case a
when b

测试a是否等于b

在您的情况下,a是一个数字(num),而b是一个布尔值(num % 4 == 0),所以这绝不会发生。

当b,c

另一个问题是

case
when b,c

测试b c

如果您想检查num是否可被24整除,则需要b c

解决方案

num移除case并使用逻辑和(&&):

(1..100).each do |num|
  case
  when num % 4 == 0 && num % 6 == 0
  ## or just :
  # when num % 24 == 0
    puts 'Cluck'
  when num % 4 == 0
    puts 'Cluck Cluck'
  when num % 5 == 0
    puts 'Cluck Cluck Cluck'
  else
    puts num
  end
end

答案 1 :(得分:1)

哦,好吧,埃里克的回答是正确的。我只是将其添加为reference -

  

虽然你可以使用case语句而不给它一个匹配的值,但它不会在那里结束,这允许case语句模仿if语句的行为,例如:

print "Enter a string: "
some_string = gets.chomp
case
when some_string.match(/\d/)
  puts 'String has numbers'
when some_string.match(/[a-zA-Z]/)
  puts 'String has letters'
else
  puts 'String has no numbers or letters'
end

答案 2 :(得分:0)

我快速阅读了this guide ,似乎您正在尝试将case用作if语句,但是您提供了一个值来匹配。

因为您将num作为case的第一个参数,所以它希望与之匹配。问题是,你的条件评估为布尔值,而num是一个数字,因此它们永远不会匹配,而else条件将始终运行。

num的开头删除case