In Ruby, posso limitare la quantità di drill-down di un oggetto non durante la visualizzazione di se stesso in IRB o quando si utilizza .inspect?
Domanda
Sto scrivendo una classe per risolvere i puzzle di Sudoku che ha circa due array bidimensionali che contengono puntatori a Cells
che puntano a questi due array bidimensionali. Qualcosa di simile a questo:
def class Sudoku
attr :rows, :columns, :blocks
def initialize
# build each of the rows, columns, and blocks with a 9x9 map of Cells
end
end
def class Cell
attr :value, :row, :column, :block
def initialize(row, column, block, value)
# set each pointer to its parent row, column and block etc
end
end
Il problema è che quando faccio qualcosa di simile:
p = Puzzle.new
in irb
, IRB si blocca. Ho modificato una parte del codice ora in modo che non lo fa, ma ora se faccio:
irb> p.rows
=> TONS OF SHIT GETS RETURNED
emette tonnellate e tonnellate di puntatori nidificati e impiega circa 20 secondi per tornare al prompt di irb
. Un sacco di questo ha a che fare con alcuni infinite puntatori cioè:.
p.rows[0][0].row[0].row[0].row[0]....
Quindi mi chiedo se c'è un modo per Ruby per tornare solo una rappresentazione superficiale di questa matrice in quanto tutti i suoi puntatori finiscono che punta a se stesso.
Soluzione
Ridefinisci ispezionare in Puzzle e visualizzare solo quello che vuoi.
Ad esempio:
def inspect
"Puzzle with size #{rows.size}"
end