我是遗漏了一些简单的东西,还是在不应该使用的情况下使用.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
发布于 2015-06-27 14:45:49
三元操作符使用?
。zero?
中的问号是方法名称的一部分,而不是三元运算符。另外:zero?
方法分别在15、5、3上执行,而不是在num%15
等上执行。下面是正确的版本。第一个版本要干净得多。
(1..100).each do |num|
puts((num%15).zero? ? "FizzBuzz" : (num%5).zero? ? "Buzz" : (num% 3).zero? ? "Fizz" : num)
end
发布于 2015-06-27 17:25:14
在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
通过这种方式可以很容易地看到正在发生的事情,查看有条件的测试,并确定在代码中断时返回的值。
https://stackoverflow.com/questions/31089808
复制相似问题