我正在处理一个继承自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]]"
时没有实例化。我缺少什么?
答案 0 :(得分:0)
ruby中没有::new
方法,您可以通过#initialize
当你打电话给super时,它会使用提供的参数调用Matrix::[]
。
查看source code:
def Matrix.[](*rows)
Matrix.rows(rows, false)
end
您可以尝试使用您的逻辑来定义Grid::rows
。或者只是覆盖#initialize
顺便说一下,写得不好,他们应该rows(rows,false)
(没有Matrix)来防止这个问题。