Ruby 2.1:可转发模块和def_delegators

Val*_*Val 1 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
Run Code Online (Sandbox Code Playgroud)

这是重构的代码:

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
Run Code Online (Sandbox Code Playgroud)

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

Ama*_*dan 5

  • 在新的代码中,selectself.select.
  • self.select,正如所有方法一样Enumerable,使用self.each.
  • self.each 转发给 @parts.each