On 23-Oct-07, at 10:02 AM, Jesù¸ Gabriel y GaláÏ wrote: Hi, > On 10/23/07, richard.j.dale / gmail.com <richard.j.dale / gmail.com> > wrote: > >> Maybe 'enque' and 'deque' could be used as names for methods to put >> items on the front of a Queue and remove items from the back >> somewhere >> in Ruby - then you wouldn't need push/pop and shift/unshift depending >> on which end of the queue you were operating on. > > I like this: > > 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. hat 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 he 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 ure, 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 anging around in memory, intermittently since unshift will re-use the parts of the array before the start). I also found (and reported, aybe 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 t... class Array alias :clingy_shift :shift def shift self[0] = nil clingy_shift end end Cheers, Bob > Jesus. > ---- Bob Hutchison -- 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/