В Ruby можно ли ограничить объем детализации объекта при отображении себя в irb или при использовании .inspect? - PullRequest
3 голосов
/ 04 ноября 2010

Я пишу класс для решения головоломок судоку, который имеет несколько двумерных массивов, которые содержат указатели на Cells, которые указывают на эти двумерные массивы. Как то так:

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

Проблема в том, что когда я делаю что-то вроде:

p = Puzzle.new

in irb, irb зависает. Я изменил часть кода сейчас, чтобы он этого не делал, но теперь, если я это сделаю:

irb> p.rows
=> TONS OF SHIT GETS RETURNED

выводит тонны и тонны вложенных указателей и занимает около 20 секунд, чтобы вернуться к приглашению irb. Многое из этого связано с некоторыми бесконечными указателями, т. Е .:

p.rows[0][0].row[0].row[0].row[0]....

Так что мне интересно, есть ли способ для Ruby просто вернуть поверхностное представление этого массива, поскольку все его указатели в конечном итоге указывают обратно на себя.

1 Ответ

2 голосов
/ 04 ноября 2010

Переопределите проверку в Puzzle и отобразите только то, что вам нужно.

Например:

def inspect
  "Puzzle with size #{rows.size}"
end
...