很长的问题,但我认为这很奇怪。我正在玩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
结束
这次代码只打印出转换为字符串的数字。然后错误地我试图添加&amp;&amp;到每个if语句结束时如此
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
有趣的是,这会打印出正确的结果。这可能是一个微不足道的答案,但有谁知道为什么会这样?这对我来说似乎很奇怪。
答案 0 :(得分:1)
when
语句正在执行逻辑&&
。
当条件为真时,这会产生连接输出的副作用。
根据您的评论,您 实际上询问的问题是,when
语句似乎无法发挥作用。问题是你写了case x
,它正在现场评估x
并将其与when
表达式进行比较。
相反,请使用&#34;裸case
&#34;,例如
case
when (x % 3) == 0
# etc
另请注意,这可能会更紧凑,例如,
def fizzbuzz(start_num, end_num)
(start_num..end_num).collect do |x|
case
when (x % 3) == 0
"fizz"
when (x % 5) == 0
"buzz"
when (x % 3 == 0 && x % 5 == 0)
"fizzbuzz"
else
x.to_s
end
end
end
答案 1 :(得分:1)
对于最后一段代码,让我们详细了解一个when
条件:
when x % 3 == 0 &&
fizzbuzz << "fizz"
尽管有缩进,但它相当于:
when x % 3 == 0 && fizzbuzz << "fizz"
请记住&&
是短路的。如果&&
表达式为false,则返回其第一个参数。否则,将评估其第二个参数并将其作为结果返回。
因此,如果x % 3 == 0
为false,则不会执行fizzbuzz << "fizz"
。如果x % 3 == 0
为真,则执行fizzbuzz << "fizz"
。完全符合预期。