我有一个类,我希望“每个”产生另一个自定义对象,所以我写了这个:

class Fq_price_set < Array
 ...
  def [](i)
    # instead of returning an array, it returns an Fq_price_rec based on the array at i
    Fq_price_rec.new(super(i))
  end

  def each
    c = 0
    until c == size
      yield self.[](c)
      c += 1
    end
  end
...
end

这有效:当我这样做时
my_price_set.each {|rec| puts rec.class}

它显示 Fq_price_rec。相似地,
my_price_set.each {|rec| puts rec.mymethod}

为该方法调用输出正确的值。

但是当我使用选择时,例如,
my_price_set.select {|rec| rec.mymethod == 1}

我收到一个错误消息,数组的“未定义方法”“mymethod”:...所以 rec(在“select”中)不是 Fq_price_rec,它是一个数组(其中 Fq_price_rec 是一个子类)。我(显然是错误的)认为覆盖“each”意味着像“select”这样的迭代方法会使用它,即“each”的子类版本。是我还必须覆盖“选择”的简单答案,还是有更优雅的解决方案。

是的,我是 Ruby 的新手。

TIA

最佳答案

为什么不摆脱从 Array 继承,而只有 include Enumerable

class Fq_price_set
  include Enumerable

  def initialize(actual_array)
    @actual_array = actual_array
  end

  # Make [] and each refer to values from @actual_array
end

关于ruby - 在我的数组子类中覆盖了 'each' 和 '[]',这有效,但 'select' 似乎忽略了它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6366321/

10-16 20:14