重构if / else语句 - Ruby

时间:2014-09-03 17:05:43

标签: ruby if-statement refactoring

我知道必须有更好的方法来写这个。我尽量不使用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

3 个答案:

答案 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)

...

通过这种方式,您将分离责任并让每个班级只负责一件事。