我怎么能干这一系列的条件陈述?

时间:2014-06-09 06:34:55

标签: ruby dry

我经常发现自己正在检查多种情况。如何减少用于达到相同效果的线数?

def super_fizzbuzz(array)
    final = []
    for num in array
        if num % 15 == 0
            final << 'FizzBuzz'
        elsif num % 5 == 0
            final << 'Buzz'
        elsif num % 3 == 0
            final << 'Fizz'
        else
            final << num
        end
    end
    final
end

6 个答案:

答案 0 :(得分:2)

def super_fizzbuzz(array)
  array.map do |num|
    a = []
    a << 'Fizz' if num % 3 == 0
    a << 'Buzz' if num % 5 == 0
    a.empty? ? num : a.join()
  end
end

答案 1 :(得分:1)

def super_fizzbuzz(array)
  final = [] 
  array.each do |num|
    num % 15 == 0 ? final << 'FizzBuzz' : num % 5 == 0 ? final << 'Buzz' : num % 3 == 0 ? final << 'Fizz' : final << num
  end
  final
end

但你的方式更具可读性。

答案 2 :(得分:1)

def super_fizzbuzz(array)
  array.map do |num|
    case 0
    when num % 15 then "FizzBuzz"
    when num % 5 then "Buzz"
    when num % 3 then "Fizz"
    else num
    end
  end
end

答案 3 :(得分:1)

这稍微复杂一些,但是将显式编码条件的数量减少到2:

FIZZBUZZ = { 3 => 'Fizz', 5 => 'Buzz' }

def super_fizzbuzz(array)
  array.map do |num|
    fbs = FIZZBUZZ.select do |divisor,cat|
      num % divisor == 0
    end.values 
    fbs.empty? ? num : fbs.join
  end
end

编码DRY时总是有危险,你把事情做得太过分了。在这种情况下,只有两个重叠的类别,我认为上面的内容有点笨拙。但是,添加另一个或两个类别:

FIZZBUZZ = { 3 => 'Fizz', 5 => 'Buzz',  7 => 'Boom', 11 => 'Whizz' }

它看起来更聪明。

答案 4 :(得分:1)

引用:

  

我觉得Fizz-Buzz对于一些程序员来说“很难”,因为(#1)它不适合在学校作业中给予他们的任何模式,而且(#2)它是不可能的直接而简单地代表必要的测试,无需重复,几乎可以用于任何常用的现代编程语言。

来源:c2.com Wiki

答案 5 :(得分:1)

另一种方式:

def super_fizzbuzz(arr)
  arr.map do |e|
    s = ''
    s << 'Fizz' if (e%3).zero?
    s << 'Buzz' if (e%5).zero?
    s = e if s.empty?
    s
  end
end

super_fizzbuzz [9, 25, 225, 31]
  #=> ["Fizz", "Buzz", "FizzBuzz", 31]