Ruby继承之谜:如何在父方法中正确调用self.class.new

Ruby Inheritance Puzzle: How to Properly Call self.class.new in Parent Method

我有一个库,我将通过使用 class 在应用程序中使用该库,该库对象通过继承它并添加一些实例变量将库对象包装在新的 class 中。如果需要,我可以更改库代码。问题是:

class A
  def process_it
    # Make a new instance
    aa = self.class.new
    do_something_to(aa)
  end

  def do_something_to(item)
    item
  end
end

class B < A
  def initialize(extra = "Default extra")
    @extra = extra
    super()
  end

  def extra
    @extra
  end
end

# I want B to inherit A's methods, like #process_it but:
b = B.new("Non-default extra")
puts b.process_it.extra => Default extra

输出应该是“非默认额外”,问题是,在父 class 中我调用 self.class.new 但不能传递任何参数给它来设置 @extra。在调用中,self.class 是 B,继承的 class,但是当我编写父 class 库 A 时,我无法预测应该将什么参数传递给 self.class.new。实际上,我可能 class C < A 具有不同的初始化参数。

是否有正确的方法来编写库 A 中的代码以实例化一个新的自身实例 class 并考虑可能的参数?

#dup 适合你吗?将 aa = self.class.new 改为 aa = self.dup