【发布时间】:2015-06-22 17:18:01
【问题描述】:
问题很长,但我认为这很奇怪。我在玩 ruby switch 语句。创建了一个小的 fizzbuzz 函数来练习。
最初创建的代码是这样的
def fizzbuzz(start_num, end_num)
fizzbuzz = []
(start_num..end_num).each do |x|
if x % 3 == 0 && x % 5 != 0
fizzbuzz << "fizz"
elsif x % 5 == 0 && x % 3 != 0
fizzbuzz << "buzz"
elsif (x % 3 == 0 && x % 5 == 0)
fizzbuzz << "fizzbuzz"
else
fizzbuzz << x.to_s
end
end
fizzbuzz
end
按预期工作。然后想玩一个switch语句。所以我尝试了:
def fizzbuzz(start_num, end_num)
fizzbuzz = []
(start_num..end_num).each do |x|
case x
when x % 3 == 0
fizzbuzz << "fizz"
when x % 5 == 0
fizzbuzz << "buzz"
when (x % 3 == 0 && x % 5 == 0)
fizzbuzz << "fizzbuzz"
else
fizzbuzz << x.to_s
end
end
fizzbuzz
结束
这次代码只打印出转换为字符串的数字。然后我错误地尝试将 && 添加到每个 when 语句的末尾,就像这样
def fizzbuzz(start_num, end_num)
fizzbuzz = []
(start_num..end_num).each do |x|
case x
when x % 3 == 0 &&
fizzbuzz << "fizz"
when x % 5 == 0 &&
fizzbuzz << "buzz"
when (x % 3 == 0 && x % 5 == 0) &&
fizzbuzz << "fizzbuzz"
else
fizzbuzz << x.to_s
end
end
fizzbuzz
end
有趣的是,这会打印出正确的结果。这可能是一个微不足道的答案,但有谁知道为什么会这样?这对我来说似乎很奇怪。
【问题讨论】:
-
因为一个switch语句只会执行一个分支,而你需要这个来打多个。对于
case,FizzBuzz 不是一个很好的用例 -
@Brennan 不是,但这不是这里的问题; OP 的代码不需要任何失败行为。也许我误解了你的意思。
-
一开始我看错了。这不是问题,一旦修复就会起作用,但它仍然显示出对这种结构如何工作的误解。它不需要要求任何失败的行为,但他肯定会尝试使用它。
-
@Brennan 我认为这更像是一个逻辑错误。如果 OP 试图依靠失败,他会得到所有三个,
fizz,buzz,和fizzbuzz。
标签: ruby switch-statement fizzbuzz