I needed a ring buffer in Ruby, and since a web search didn’t yield anything I did it myself. Here you go, use as you wish:
Simple RingBuffer implementation ================================ see class RingBufferTest below for usage examples ================================================= class RingBuffer \< Array alias\_method :array\_push, :push alias\_method :array\_element, :[] def initialize( size ) @ring\_size = size super( size ) end def push( element ) if length == @ring\_size shift \# loose element end array\_push element end \# Access elements in the RingBuffer \# \# offset will be typically negative! \# def [](offset%20=%200) return self.array\_element( - 1 + offset ) end end Usage example and unit test for the Ring Buffer =============================================== require 'test/unit' class RingBufferTest \< Test::Unit::TestCase \# Usage example (and test) def test\_ring\_buffer rb = RingBuffer.new 2 # create RingBuffer with 2 elements rb.push 'Apple' # put 'Apple' into RingBuffer rb.push 'Pear' assert( rb[] == 'Pear' ) # the most recent element in the RingBuffer # is the 'Pear' assert( rb[0] == 'Pear' ) # same as before assert( rb[-1] == 'Apple' ) # get the second most recent element - it # shold be 'Apple' rb.push 'Mango' assert( rb == ['Pear', 'Mango'] ) # the 'Mango' has pushed the 'Apple' out of # the RingBuffer end end