On 23-Oct-07, at 10:02 AM, JesĂșs Gabriel y GalĂĄn wrote:
Hi,
class Array
alias :enqueue :push
alias :dequeue :shift
end
Then you get Queue semantics and the start of the queue is the first
element in the Array :-). (you could do enqueue â unshift, dequeue
â pop if you rather have the first element of the queue the last in
the array).
You have to be really careful here. Push/pop and shift/unshift are
not the same functions working on opposite ends of the array, no
matter what it sounds like from the documentation.
There is an issue with shift that I think amounts to a bug. Shift/
unshift work at the beginning of the array, so shift conceptually
requires moving array elements around. Ruby (and other programming
languages too, specifically some implementations of Common Lisp)
optimise shift so as to not have to actually move anything in memory.
What it does is, more or less, to move the start of the array ârightâ
â so no movement but there is now some part of the array before the
start of the array. The bug is that Ruby doesnât stomp on the cell of
the array that is being shifted before the start, and so that cell
still contains a reference to some object (and IT IS INVISIBLE).
You say this will never happen? or rarely? Well, itâs not âneverâ for
sure, and ârarelyâ doesnât help much when you get caught by it. How
did I find out about it? Implementing a cache (the uncached stuff was
hanging around in memory, intermittently since unshift will re-use
the parts of the array before the start). I also found (and reported,
maybe even supplied a patch for) a problem in Mongrelâs thread
management code that was using shift. How did I debug it the first
time? Donât ask.
I believe/hope that this will be fixed in some future version of Ruby.
This monkey patch fixes the problem, if this is how you want to solve
itâŠ
class Array
alias :clingy_shift :shift
def shift
self[0] = nil
clingy_shift
end
end
Cheers,
Bob
Jesus.
Bob H. â tumblelog at http://
www.recursive.ca/so/
Recursive Design Inc. â weblog at http://www.recursive.ca/
hutch
http://www.recursive.ca/ â works on http://www.raconteur.info/
cms-for-static-content/home/