Ruby 自定义类实例化其超类对象

Ruby 自定义类实例化其超类对象,ruby,inheritance,matrix,Ruby,Inheritance,Matrix,我正在处理一个从矩阵继承的网格类: 我似乎无法覆盖::initialize,因为它是私有的。上面的方法可以工作,但是会生成Matrix类的实例,而不是我的自定义类,所以我被卡住了。意识到我的类在调用_s并接收矩阵[[X,O],[O,O]]时没有实例化。我缺少什么?ruby中没有::new方法,您可以通过initialize来定义它 当您调用super时,它调用的是矩阵::[]和提供的参数 看看下面的例子: 您可以尝试使用逻辑定义Grid::rows。或者只是重写初始化 顺便说一句,这是写得很糟糕

我正在处理一个从矩阵继承的网格类:

我似乎无法覆盖::initialize,因为它是私有的。上面的方法可以工作,但是会生成Matrix类的实例,而不是我的自定义类,所以我被卡住了。意识到我的类在调用_s并接收矩阵[[X,O],[O,O]]时没有实例化。我缺少什么?

ruby中没有::new方法,您可以通过initialize来定义它

当您调用super时,它调用的是矩阵::[]和提供的参数

看看下面的例子:

您可以尝试使用逻辑定义Grid::rows。或者只是重写初始化


顺便说一句,这是写得很糟糕的,他们应该在没有矩阵的情况下执行rowsrows,false来防止这个问题。

由于某种原因,无法为矩阵类重写initialize方法。当对类(如Array)进行子类化时,我可以重新定义initialize并使用任何参数调用super。到处都有新方法。@nicooga尽管无法重写initialize,答案的其余部分是否有帮助?@DaveNewton:在ruby中,您没有使用def self定义初始值设定项函数。new您使用def定义初始值设定项函数吗我知道这一点。将其描述为没有::new是不正确的,因为new经常被重写。你是说初始化吗?
class Grid < Matrix
  def self.[](x,y=x)
    if x.is_a? String
      ary = x.lines.map { |l| l.strip.split('|') }.map.with_index do |col,x|
        col.map.with_index { |cell,y| ::Cell.new x: x, y: y, alive: !!(cell =~ /O/i) }
      end
      super *ary
    else
      super *Array.new(y) { [::Cell.new(x: x, y: y, alive: [true,false].sample)] * x }
    end
  end
end
def Matrix.[](*rows)
  Matrix.rows(rows, false)
end