我知道必须有更好的方法来写这个。我尽量不使用if / else,或者至少减少它们,但我仍然是Ruby的菜鸟,所以一些重构帮助将非常感激。
def super_fizzbuzz(array)
array.map {|x|
if x % 15 == 0
"FizzBuzz"
elsif x % 3 == 0
"Fizz"
elsif x % 5 == 0
"Buzz"
else x
end}
end
答案 0 :(得分:3)
我会这样做:
def super_fizzbuzz(array)
array.map do |x|
case
when x % 15 == 0 then 'FizzBuzz'
when x % 3 == 0 then 'Fizz'
when x % 5 == 0 then 'Buzz'
else x
end
end
end
答案 1 :(得分:1)
[破坏者]
有several ways来做这个经典问题......这种方式没有ifs / elses
(1..100).each do |x|
m3 = x.modulo(3) == 0
m5 = x.modulo(5) == 0
puts case
when (m3 and m5) then 'FizzBuzz'
when m3 then 'Fizz'
when m5 then 'Buzz'
else x
end
end
或者,如果您更喜欢if语句和小代码块,这是对您拥有的内容的良好重构
(1..100).each{|i|
x = ''
x += 'Fizz' if i%3==0
x += 'Buzz' if i%5==0
puts(x.empty? ? i : x);
}
答案 2 :(得分:1)
我会做类似
的事情array.map do |x|
[FizzBuzz, Fizz, Default].map do |fizzer|
fizzer.new(x).get
end.compact.first
end
class FizzBuzz
attr_reader :x
private :x
def initialize(x)
@x = x
end
def get
'FizzBuzz' if x % 15
end
end
class Fizz
attr_reader :x
private :x
def initialize(x)
@x = x
end
def get
'FizzBuzz' if x % 3
end
end
Default = Struct(:get)
...
通过这种方式,您将分离责任并让每个班级只负责一件事。