Переопределить метод `[] =` в массиве ruby - PullRequest
0 голосов
/ 29 октября 2018

У меня есть класс CustomArray:

class CustomArray < Array
  def initialize(row, col)
    @row = row
    @col = col
    @array ||= Array.new(size=row * col)
  end
end

Как я могу переопределить []= метод CustomArray? Я сделал:

class CustomArray < Array
  def []=(length, row, col)
    puts @array[0], col, row
  end
end

Независимо от того, какое изменение я внесу в @array, длина нового экземпляра массива остается нулевой.

Я попытался заменить значение self, но похоже, что self только для чтения.

1 Ответ

0 голосов
/ 29 октября 2018

Вам не нужна переменная @array экземпляра при создании подкласса Array - каждый экземпляр уже является массивом.

Предполагая, что вы пытаетесь реализовать двумерный массив поверх встроенного (одномерного) Array, что-то вроде этого должно работать:

class CustomArray < Array
  def initialize(rows, cols)
    @rows = rows
    @cols = cols
    super(rows * cols)
  end

  def []=(row, col, value)
    super(row * @rows + col, value)
  end

  def [](row, col)
    super(row * @rows + col)
  end
end

Однако базовые классы Ruby сильно оптимизированы, и их подклассы могут быть довольно сложными (см. https://words.steveklabnik.com/beware-subclassing-ruby-core-classes).

Следовательно, обычно проще использовать композицию вместо наследования, т. Е. Использовать переменную экземпляра @array, но не наследовать от Array, например ::

class CustomArray
  def initialize(rows, cols)
    @rows = rows
    @cols = cols
    @array = Array.new(rows * cols)
  end

  def []=(row, col, value)
    @array[row * @rows + col] = value
  end

  def [](row, col)
    @array[row * @rows + col]
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...