Skip to content

Instantly share code, notes, and snippets.

@eerohele
Last active October 29, 2018 12:00
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save eerohele/1904422 to your computer and use it in GitHub Desktop.
Save eerohele/1904422 to your computer and use it in GitHub Desktop.
A simple ring buffer for Ruby.
class RingBuffer < Array
attr_reader :max_size
def initialize(max_size, enum = nil)
@max_size = max_size
enum.each { |e| self << e } if enum
end
def <<(el)
if self.size < @max_size || @max_size.nil?
super
else
self.shift
self.push(el)
end
end
alias :push :<<
end
@Nimster
Copy link

Nimster commented Nov 15, 2012

This has a major bug. << by default means "push", so
a = RingBuffer.new(3)
a << "first"
a << "second"
a << "third" # a == ["first", "second", "third"]
# but now
a << "fourth" # a == ["fourth", "first", "second"]

Where one would expect after the fourth insertion, a would contain ["second", "third", "fourth"]. This is consistent with a RingBuffer being a data structure for MRU access, i.e oldest elements should be overwritten.

@Nimster
Copy link

Nimster commented Nov 15, 2012

I fixed this on my fork, https://gist.github.com/4078106

@eerohele
Copy link
Author

eerohele commented Jan 4, 2013

@Nimster: many thanks for pointing it out, fixed. I'm still very much a Ruby newbie, and certainly much more so when I originally created this Gist.

@captainpete
Copy link

Also check out this threadsafe one http://git.io/8RZjeA

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment