On 14.05.2007 14:59, Harry Kakueki wrote:
> Hi,
> 
> I was reading this 
> http://www.rubycentral.com/book/ref_c_hash.html#Hash.shift
> 
> and I wondered how this could be useful. I must be missing something.
> 
> I tried this
> 
> ahash = {"a" => "apple","b"=> "boat","c" =>"car", "dog" => "zebra",
> "elephant" => "yak"}
> p ahash #=>{"a" => "apple","b"=> "boat","c" =>"car","elephant" =>
> "yak", "dog" => "zebra"}
> p ahash.shift #=>["a", "apple"]
> p ahash.shift #=>["b", "boat"]
> p ahash.shift #=>["c", "car"]
> p ahash.shift #=>["elephant", "yak"]
> p ahash.shift #=>["dog", "zebra"]
> 
> Since the order of a hash is not guaranteed, you do not know what you
> are shifting at any given time. Is this right?
> If you just wanted to shift everything you could use Hash#each.
> 
> What am I missing?

I never had use for this myself but it might be useful in cases where 
you want to iterate through a (possibly temporary) Hash and make sure 
that elements that you have processed are removed.  Like

 >> h={:foo=>1, :bar=>2, :baz=>3}
=> {:baz=>3, :foo=>1, :bar=>2}
 >> until h.empty?
 >>   k, v = h.shift
 >>   puts "processing: #{k} - #{v}"
 >> end
processing: baz - 3
processing: foo - 1
processing: bar - 2
=> nil
 >> h
=> {}

If you now leave the loop early (for whatever reasons, "return" or 
raise) you only leave elements that still have to be processed in the Hash.

Kind regards

	robert