Fizzbuzz 开关语句
Fizzbuzz switch statement
很长的问题,但我认为这很奇怪。我在玩 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
有趣的是,这会打印出正确的结果。这可能是一个微不足道的答案,但有人知道为什么会这样吗?这对我来说似乎很奇怪。
when
语句符合逻辑 &&
。
当条件为真时,这会产生连接输出的副作用。
根据您的评论,您实际上 提出的问题是 when
语句似乎不起作用。问题是你写了 case x
,它正在现场评估 x
并将其与 when
表达式进行比较。
而是使用 "naked case
",例如
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
最后一段代码,我们详细看一个when
条件:
when x % 3 == 0 &&
fizzbuzz << "fizz"
尽管有缩进,但它等同于:
when x % 3 == 0 && fizzbuzz << "fizz"
记住&&
是短路。 &&
表达式 returns 它的第一个参数如果为假。否则,它的第二个参数被评估并作为结果返回。
所以如果x % 3 == 0
为false,则fizzbuzz << "fizz"
不执行。如果 x % 3 == 0
为真,则执行 fizzbuzz << "fizz"
。完全符合预期。
很长的问题,但我认为这很奇怪。我在玩 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
有趣的是,这会打印出正确的结果。这可能是一个微不足道的答案,但有人知道为什么会这样吗?这对我来说似乎很奇怪。
when
语句符合逻辑 &&
。
当条件为真时,这会产生连接输出的副作用。
根据您的评论,您实际上 提出的问题是 when
语句似乎不起作用。问题是你写了 case x
,它正在现场评估 x
并将其与 when
表达式进行比较。
而是使用 "naked case
",例如
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
最后一段代码,我们详细看一个when
条件:
when x % 3 == 0 &&
fizzbuzz << "fizz"
尽管有缩进,但它等同于:
when x % 3 == 0 && fizzbuzz << "fizz"
记住&&
是短路。 &&
表达式 returns 它的第一个参数如果为假。否则,它的第二个参数被评估并作为结果返回。
所以如果x % 3 == 0
为false,则fizzbuzz << "fizz"
不执行。如果 x % 3 == 0
为真,则执行 fizzbuzz << "fizz"
。完全符合预期。