Мне нужен список FIFO фиксированного размера, который можно произвольно установить при создании объекта. Массив работает, но мне надоело проверять его размер и выталкивать самый старый элемент каждый раз, когда я нажимаю новое значение. Я знаю, что люди говорили, что создание подклассов Array - плохая идея, но я все еще хочу сделать это, так как это самое элегантное решение для моих нужд.
Вот мой код.
class FIFOList < Array
attr_reader :FIFO_length
attr_writer :FIFO_length
def initialize(l)
super()
@FIFO_length = l
end
def push(element)
super(element)
self.shift if self.length > @FIFO_length
end
С помощью этого объекта я могу определить FIFO из 25 элементов следующим образом:
a = FIFOList.new(25)
и вставлять элементы в течение всего дня и всегда иметь самые последние 25. Пока я нажимаю элементы по одному за раз (a.push ()), все хорошо. Тем не менее, я хотел бы иметь возможность инициализировать новый FIFO с массивом, как это можно сделать с собственным объектом Array.
a = [1,2,3,4,5]
Что дает массив a из 5 элементов. Но это не так, и я не уверен, что с этим делать. Вот сеанс IRB, показывающий проблему:
irb(main):008:0* a = FIFOList.new(5)
=> []
irb(main):009:0> a.class
=> FIFOList
irb(main):010:0> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
irb(main):011:0> a.class
=> Array
Таким образом, вместо статического массива, назначаемого в качестве «содержимого» объекта FIFOList, «a» просто становится ссылкой на новый статический массив. Это не то поведение, которое я хочу. Из того, что я прочитал, кажется, что, возможно, мне нужно добавить методы в мой класс FIFOList для переопределения [] и, возможно, [] =, но я не уверен, как это сделать. Если это неправильный подход, я был бы доволен методом «загрузки», который принимает массив в качестве параметра и выполняет магию внутри, но я не уверен, как «загрузить» переданные значения в себя. Может кто-нибудь помочь?