使用.zero?而不是== 0?

时间:2015-06-27 14:29:15

标签: 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" : 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

2 个答案:

答案 0 :(得分:4)

在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

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

答案 1 :(得分:3)

三元运算符使用zero?zero?中的问号是方法名称的一部分,而不是三元运算符。其他:num%15方法分别在15,5,3上执行,而不是(1..100).each do |num| puts((num%15).zero? ? "FizzBuzz" : (num%5).zero? ? "Buzz" : (num% 3).zero? ? "Fizz" : num) end 等。下面是正确的版本。第一个版本更清洁。

process(T)
begin
    if T(0) = '1' then
        x<='1';
    elsif T(1) = '1' then
        y<='0';
    end if;
end process ;