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