Fizzbuzz切换声明

时间:2015-06-22 17:18:02

标签: ruby switch-statement fizzbuzz

很长的问题,但我认为这很奇怪。我正在玩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 

有趣的是,这会打印出正确的结果。这可能是一个微不足道的答案,但有谁知道为什么会这样?这对我来说似乎很奇怪。

2 个答案:

答案 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"。完全符合预期。