1

我正在研究一个继承自的 Grid 类Matrix

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

我似乎无法覆盖::initialize,因为它是私人的。以上工作但产生Matrix类的实例而不是我的自定义类,所以我被卡住了。意识到我的班级在调用to_s和接收"Matrix[[X,O],[O,O]]"东西时没有实例化。我错过了什么?

4

1 回答 1

0

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

当您调用 super 时,它会Matrix::[]使用提供的参数进行调用。

查看源代码

def Matrix.[](*rows)
  Matrix.rows(rows, false)
end

您可以尝试Grid::rows用您的逻辑进行定义。或者只是覆盖#initialize


顺便说一句,这写得不好,他们应该这样做rows(rows,false)(没有矩阵)来防止这个问题。

于 2013-03-04T20:20:45.790 回答