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    

出于某种奇怪的原因,不是将 cluck cluck 放在第四行或将 cluck 放在第 24 行,它只是放置 1 到 100 的列表。我无法弄清楚 switch 语句有什么问题。使用逗号或 && 时的第一个也不会改变任何东西(我不相信它应该这样做)。

4

3 回答 3

3

问题

情况 a 当 b

case a
when b

测试是否a等于b.

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

当 b,c

另一个问题是

case
when b,c

测试 ifb c.

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

解决方案

删除numcase使用逻辑与 ( &&) :

(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
于 2017-01-17T22:51:28.667 回答
1

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

尽管您可以使用 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
于 2017-01-17T22:57:30.173 回答
0

我快速阅读了本指南,似乎您正在尝试使用caseasif语句,但您提供了一个匹配的值。

因为您给出了num的第一个参数case,所以它期望匹配它。问题是,您的条件评估为布尔值,并且 num是一个数字,因此它们永远不会匹配,并且 else 条件将始终运行。

从. num_case

于 2017-01-17T22:51:55.520 回答