Вам не нужна переменная @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