问题很长,但我觉得很奇怪。我在玩红宝石开关的声明。创建了一个小的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 按预期工作。然后想玩开关语句。所以我试着:
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 有趣的是,这会打印出正确的结果。这可能是一个微不足道的答案,但有谁知道为什么会这样呢?我觉得挺奇怪的。
发布于 2015-06-22 17:29:20
when语句正在执行逻辑&&。
当条件为真时,这就产生了连接输出的副作用。
根据您的评论,您实际上要问的问题是,when语句到底发生了什么,似乎不起作用。问题在于您编写了case x,它在现场计算x并将其与when表达式进行比较。
相反,使用“裸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发布于 2015-06-22 17:29:50
对于最后一段代码,让我们详细查看一个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"。这正是人们所期望的。
https://stackoverflow.com/questions/30986029
复制相似问题