Ruby 使用0.0?而不是==0?

Ruby 使用0.0?而不是==0?,ruby,Ruby,我是缺少了一些简单的东西,还是在不应该使用它的情况下使用了.zero? 这项工作: (1..100).each do |num| puts(num%15==0 ? "FizzBuzz" : num%5==0 ? "Buzz" : num% 3==0 ? "Fizz" : num) end 这并不是: (1..100).each do |num| puts(num%15.zero? "FizzBuzz" : num%5.zero? "Buzz" : num% 3.zero? "Fizz"

我是缺少了一些简单的东西,还是在不应该使用它的情况下使用了
.zero?

这项工作:

(1..100).each do |num|
  puts(num%15==0 ? "FizzBuzz" : num%5==0 ? "Buzz" : num% 3==0 ? "Fizz" : num)
end
这并不是:

(1..100).each do |num|
  puts(num%15.zero? "FizzBuzz" : num%5.zero? "Buzz" : num% 3.zero? "Fizz" : num)
end
当我使用第二个代码块时,出现以下错误:

syntax error, unexpected tSTRING_BEG, expecting keyword_end
...o ? "FizzBuzz" : num%5.zero?  "Buzz" : num%3.zero?  "Fizz" :...
syntax error, unexpected ':', expecting keyword_end
...zzBuzz" : num%5.zero?  "Buzz" : num%3.zero?  "Fizz" : num

三值运算符使用
zero?
中的问号是方法名称的一部分,而不是三元运算符。另外:分别在15、5、3执行
zero?
方法,而不是在
num%15
等上执行。下面是正确的版本。第一个版本更干净

(1..100).each do |num|
  puts((num%15).zero? ? "FizzBuzz" : (num%5).zero? ? "Buzz" : (num% 3).zero? ? "Fizz" : num)
end

Ruby不鼓励使用多个三元语句来提供复杂的条件测试。这会导致代码难以读取和维护。而不是使用:

(1..100).each do |num|
  puts(num%15==0 ? "FizzBuzz" : num%5==0 ? "Buzz" : num% 3==0 ? "Fizz" : num)
end
使用类似于:

(1..100).each do |num|
  response = if num % 15 == 0
              'FizzBuzz'
            elsif num % 5 == 0
              'Buzz'
            elsif num % 3 == 0
              'Fizz'
            else
              num
            end
  puts response
end
或者更好的方法是,使用
case
语句删除链接的
elsif

(1..100).each do |num|
  response = case 
             when num % 15 == 0
               'FizzBuzz'
             when num % 5 == 0
               'Buzz'
             when num % 3 == 0
               'Fizz'
             else
               num
             end
  puts response
end

以这种方式分解代码时,很容易看到发生了什么,看到条件测试并确定返回的值。

感谢您提供第二个示例。我试图把它放在一起,但实际上没有写出If/else语句。