[#1026] Is this a bug? — Dave Thomas <Dave@...>

18 messages 2000/01/03

[#1084] Infinite loop — Dave Thomas <Dave@...>

17 messages 2000/01/11

[#1104] The value of while... — Dave Thomas <Dave@...>

24 messages 2000/01/11

[ruby-talk:01105] Re: Infinite loop

From: matz@... (Yukihiro Matsumoto)
Date: 2000-01-11 23:42:35 UTC
List: ruby-talk #1105
Hi,

In message "[ruby-talk:01102] Re: Infinite loop"
    on 00/01/11, Clemens Hintze <clemens.hintze@alcatel.de> writes:
|> 
|> Shouldn't there be a shift in there?
|
|No, please! I consider this a very nice property of Array#hash! But
|unfortunately some old behavior is broken with this solution! You
|cannot do
|
|   a1 = ["hello", 2, "world"]
|   a2 = ["world", 2, "hello"]
|   a1.hash == a2.hash   # Broken!
|   a1.hash
|417265 
|   a2.hash
|416997
|
|With old implementation, it was possible as both calculated hash
|numbers was equal! Furthemore I consider this behavior as inconsistent
|regarding the example you have shown above.

Hmm, the only requirement for `hash' method is

  * a.hash == b.hash where a.eql?(b) is true.

So I guess your expectation may be too much.

BTW, My second option was broken for arrays with string elements.
How about like below?

         def hash
           h = self.id
           for item in self
             if item.kind_of? Array
               h ^= item.id
             else
               h ^= item.hash
             end
           end
           h
         end

In This Thread