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