如何重构这个Ruby代码?

时间:2012-09-10 02:34:25

标签: ruby coding-style refactoring readability

我创建了以下内容,但是看起来很神秘。有没有办法以更加Ruby风格或可理解的方式编写它?

此方法删除数字下方的较低因子。因此,10.high_factors会返回[6,7,8,9,10]。 6可被2整除,因此2被删除。列表中没有大于6的倍数,因此保持不变。

class Fixnum
  def high_factors
    # Get the numbers that are not divisible by lower ones below self
    list = (2..self).to_a
    2.upto(self).each do |i|
      ((i+1)..self).each { |j| list.delete i if j.is_divisible_by? i }
    end

    list
  end

  def is_divisible_by? divisor
    self % divisor == 0
  end
end

Ruby 1.9.3

3 个答案:

答案 0 :(得分:5)

您的方法的结果将始终是从(N/2) + 1N的数字列表。

对于每个i<=(N/2)2*i也会出现在列表中。

对于列表中的每个j >= (N/2)+1,其上不会有k=x*j,其中x是大于1的整数,因为2*j > N

因此,如果您的方法只返回((self/2 + 1)..self).to_a,它也可以按您的意愿工作。

答案 1 :(得分:2)

这个怎么样?只需删除可被上面的数字整除的数字。

class Fixnum
  def high_factors
    # Get the numbers that are not divisible by lower ones below self
    (2..self).reject do |i|
      (i+1..self).any? { |j| j.divisible_by?(i) }
    end
  end

  def divisible_by?(divisor)
    self % divisor == 0
  end
end

ps:在ruby中,通常在布尔函数的开头省略'is_',因为我们可以添加?

答案 2 :(得分:1)

Heres mine

def high_factors
  ary = (2..self).to_a
  ary.reject do |factor|
    ary.index {|num| num != factor and num % factor == 0}
  end
end

它的工作原因如果找不到合适的匹配,则Array #index返回nil。