首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Fizzbuzz开关语句

Fizzbuzz开关语句
EN

Stack Overflow用户
提问于 2015-06-22 17:18:01
回答 2查看 321关注 0票数 0

问题很长,但我觉得很奇怪。我在玩红宝石开关的声明。创建了一个小的fizzbuzz函数来练习。

最初创建的代码如下

代码语言:javascript
运行
复制
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 

按预期工作。然后想玩开关语句。所以我试着:

代码语言:javascript
运行
复制
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语句的末尾,如下所示

代码语言:javascript
运行
复制
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 

有趣的是,这会打印出正确的结果。这可能是一个微不足道的答案,但有谁知道为什么会这样呢?我觉得挺奇怪的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-22 17:29:20

when语句正在执行逻辑&&

当条件为真时,这就产生了连接输出的副作用。

根据您的评论,您实际上要问的问题是,when语句到底发生了什么,似乎不起作用。问题在于您编写了case x,它在现场计算x并将其与when表达式进行比较。

相反,使用“裸case",例如,

代码语言:javascript
运行
复制
case
when (x % 3) == 0
  # etc

还请注意,可以将其包装得更紧一些,例如,

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2015-06-22 17:29:50

对于最后一段代码,让我们详细查看一个when条件:

代码语言:javascript
运行
复制
when x % 3 == 0 &&
    fizzbuzz << "fizz"

尽管有缩进,它还是相当于:

代码语言:javascript
运行
复制
when x % 3 == 0 && fizzbuzz << "fizz"

记住,&&是短路的.如果&&表达式为false,则返回其第一个参数。否则,它的第二个参数将被计算并作为结果返回。

因此,如果x % 3 == 0为false,则不执行fizzbuzz << "fizz"。如果x % 3 == 0为真,则执行fizzbuzz << "fizz"。这正是人们所期望的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30986029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档