Ruby 2.1:可转发模块和def_delegators

时间:2014-09-09 01:01:32

标签: ruby oop composition

我有一个关于我在一个例子上做过重构的问题。

以下是原始代码:

class Parts
  attr_reader :parts

  def initialize(parts)
    @parts = parts
  end

  def size
    parts.size
  end

  def spares
    parts.select{|part| part.needs_spare}
  end
end

以下是重构代码:

require 'forwardable'
class Parts
  extend Forwardable
  def_delegators :@parts, :size, :each
  include Enumerable

  def initialize(parts)
    @parts = parts
  end

  def spares
    select{|part| part.needs_spare}
  end
end

在备用方法中,原始代码执行“parts.select {| part | part.needs_spare}”,然后在重构中将其调整为“select {| part | part.needs_spare}”。新的备用方法如何知道它从哪个实例变量中选择?

1 个答案:

答案 0 :(得分:5)

  • 在新代码中,selectself.select
  • self.select,因为Enumerable中的所有方法都使用self.each
  • self.each转发至@parts.each