From: John Joyce Date: 2007-05-09T09:34:04+09:00 Subject: Re: Equality question On May 9, 2007, at 1:55 AM, Brian Candler wrote: > On Wed, May 09, 2007 at 12:58:01AM +0900, Sebastian Hungerecker wrote: >> Brian Candler wrote: >>> o1 = [:defuzz_configs, {"conf"=>"foo.txt"}] >>> o2 = [:defuzz_configs, {"conf"=>"foo.txt"}] >>> p o1 == o2 # prints true >>> p o1.hash == o2.hash # prints false ?? <<<<<<<<<<< >> >> That's because the Hashs in o1 and o2 are two different objects. > > So hashes and arrays don't behave the same in this regard? > > o1 = ["hello", ["world"]] > o2 = ["hello", ["world"]] > p o1 == o2 > p o1.hash == o2.hash # prints true > > o1 = {"key"=>"hello"} > o2 = {"key"=>"hello"} > p o1 == o2 > p o1.hash == o2.hash # prints false > > I wonder why this is? > I'm a bit confused by this too. I've got seemingly conflicting stuff here: irb(main):001:0> h1 = ['hi', ['dude']] => ["hi", ["dude"]] irb(main):002:0> h2 = ['hi', ['dude']] => ["hi", ["dude"]] irb(main):003:0> h1.class => Array irb(main):004:0> h2.class => Array irb(main):005:0> h1 == h2 => true irb(main):006:0> h1[1] == h2[1] => true irb(main):007:0> h3 = h2 => ["hi", ["dude"]] irb(main):009:0> h2 == h3 => true irb(main):010:0> hash1 = {'greet' => 'hi'} => {"greet"=>"hi"} irb(main):011:0> hash1.class => Hash irb(main):012:0> hash2 = hash1 => {"greet"=>"hi"} irb(main):013:0> hash1 == hash2 => true irb(main):014:0> hash1[1] => nil irb(main):016:0> hash1.inspect => "{\"greet\"=>\"hi\"}" irb(main):017:0> hash1.class => Hash irb(main):019:0> 'greet' => "greet" irb(main):020:0> hash1['greet'] => "hi" irb(main):025:0> hash1['greet'] == hash2['greet'] => true irb(main):026:0> p h1 == h2 true => nil irb(main):027:0> p hash1 == hash2 true => nil irb(main):028:0> p hash1 {"greet"=>"hi"} => nil irb(main):029:0> p hash1.hash 1773356 => nil irb(main):030:0> p hash1.to_hash {"greet"=>"hi"} => nil irb(main):031:0> p hash2.hash 1773356 => nil irb(main):032:0> hash1 == hash2 => true irb(main):033:0> hash1.hash == hash2.hash => true irb(main):034:0> o1 = {"key" => "hi"} => {"key"=>"hi"} irb(main):035:0> o2 = {"key" => "hi"} => {"key"=>"hi"} irb(main):037:0> p o1 == o2 true => nil irb(main):038:0> o1.hash => 1844056 irb(main):039:0> o2.hash => 1830256 irb(main):040:0> o1 = {"name" => "bob"} => {"name"=>"bob"} irb(main):041:0> o2 = {"name" => "bob"} => {"name"=>"bob"} irb(main):042:0> o1 == o2 => true irb(main):043:0> o1.hash => 1769496 irb(main):044:0> o2.hash => 1757086 irb(main):045:0> h1.hash => -382289162 irb(main):046:0> h2.hash => -382289162 irb(main):047:0> hash1.hash => 1773356 irb(main):048:0> hash2.hash => 1773356 irb(main):049:0>