My friend and I were writing some code for an event. We were programming in ruby and (un)fortunately we had different versions of ruby. I had Ruby version 1.9.1 and his version was 1.8.6. We wrote a few lines, which used hash. When I tried it on my machine, it worked perfectly fine but on my friend’s machine, it was giving absurd behavior.
We actually were inserting some values in hash in an order and wanted to retrieve it in same order. This is ok in ruby 1.9.1. But if one do the same in ruby 1.8.6, ruby doesn't preserve the order in hash. On debugging and googling, we got that no ordering was the root cause for our code not working in ruby 1.8.6.
Here are some more differences in ruby 1.8.6 and 1.9.1 regarding hash.
RUBY_VERSION = > 1.8.6
> > hash = {:a= > 'A', :b= >'B', :c= >'C', :d= >'D'}
= > {:b= >"B", :c= >"C", :d= >"D", :a= >"A"}
> > hash.to_a
= > [[:b, "B"], [:c, "C"], [:d, "D"], [:a, "A"]]
> > hash.keys
= > [:b, :c, :d, :a]
> > hash.values
= > ["B", "C", "D", "A"]
RUBY_VERSION = > 1.9.1
> > hash = {:a= > 'A', :b= >'B', :c= >'C', :d= >'D'}
= > {:a= >"A", :b= >"B", :c= >"C", :d= >"D"}
> > hash.to_a
= > [[:a, "A"], [:b, "B"], [:c, "C"], [:d, "D"]]
> > hash.keys
= > [:a, :b, :c, :d]
> > hash.values
= > ["A", "B", "C", "D"]
2. Better to_s method(similar to hash.inspect).
RUBY_VERSION = > 1.8.6
> > hash = {:a= > 1, :b= >2, :c= >3, :d= >4}
= > {:b= >2, :c= >3, :d= >4, :a= >1}
> > hash.to_s
= > "b2c3d4a1"
RUBY_VERSION = > 1.9.1
> > hash = {:a= > 1, :b= >2, :c= >3, :d= >4}
= > {:a= >1, :b= >2, :c= >3, :d= >4}
> > hash.to_s
= > "{:a= >1, :b= >2, :c= >3, :d= >4}"
3. hash.each and hash.each_pair
RUBY_VERSION = > 1.8.6
> > hash = {:a= > 1, :b= >2, :c= >3, :d= >4}
= > {:b= >2, :c= >3, :d= >4, :a= >1}
> > hash.each{|x| p x}
[:b, 2]
[:c, 3]
[:d, 4]
[:a, 1]
= > {:b= >2, :c= >3, :d= >4, :a= >1}
> > hash.each_pair{|x| p x}
(irb):48: warning: multiple values for a block parameter (2 for 1)
from (irb):48
[:b, 2]
(irb):48: warning: multiple values for a block parameter (2 for 1)
from (irb):48
[:c, 3]
(irb):48: warning: multiple values for a block parameter (2 for 1)
from (irb):48
[:d, 4]
(irb):48: warning: multiple values for a block parameter (2 for 1)
from (irb):48
[:a, 1]
= > {:b= >2, :c= >3, :d= >4, :a= >1}
RUBY_VERSION = > 1.9.1
> > hash = {:a= > 1, :b= >2, :c= >3, :d= >4}
= > {:a= >1, :b= >2, :c= >3, :d= >4}
> > hash.each{|x| p x}
[:a, 1]
[:b, 2]
[:c, 3]
[:d, 4]
= > {:a= >1, :b= >2, :c= >3, :d= >4}
> > hash.each_pair{|x| p x}
[:a, 1]
[:b, 2]
[:c, 3]
[:d, 4]
= > {:a= >1, :b= >2, :c= >3, :d= >4}
4. hash.select now returns hash instead of array
RUBY_VERSION = > 1.8.6
> > hash = {:a= > 1, :b= >2, :c= >3, :d= >4}
= > {:b= >2, :c= >3, :d= >4, :a= >1}
> > hash.select{|k,v| k == :c }
= > [[:c, 3]]
RUBY_VERSION = > 1.9.1
> > hash = {:a= > 1, :b= >2, :c= >3, :d= >4}
= > {:a= >1, :b= >2, :c= >3, :d= >4}
> > hash.select{|k,v| k == :c }
= > {:c= >3}