On Mon, 19 Dec 2005 15:21:22 -0000, Logan Capaldo <logancapaldo / gmail.com>  
wrote:

>
> On Dec 19, 2005, at 9:10 AM, Andrea wrote:
>
>> I'm using an hash object and i use a Termine Object for the key and, for
>> now, a String for the value.
>>
>
> You need to overload the == operator and the hash method.
>
> class Termine
>     alias eql? ==
>     def ==(other)
>            descrizione == other.descrizione and lingua == other. lingua
>     end
>     def hash
>          (descrizione + lingua).hash
>     end
> end
>
> t = Termine.new("Hi")
> t2 = Termine.new("Hi")
>
> t == t2 #=> true
>
> h = {}
> h[t] = "short hello"
> h #=> {#<Termine:0x24a22c @lingua="it", @descrizione="Hi">=>"short  
> hello"}
> h.has_key?(t2) #=> true
>

I was playing around with this, and now I'm doubly worried I have a bug,  
or have missed something else. The last line in your code gives out  
'false' for me. I was experimenting with this:

class Dclz
   @str = "A string"
   attr_reader :str

   def ==(o)
     self.str == o.str
   end

   def ===(o)
     self.str === o.str
   end

   def hash
     self.str.hash
   end
end

case Dclz.new
when Dclz.new
   puts "Works"
else
   puts "doesn't"
end                                   # => "Works"

h = Hash.new { "Failure" }
h[d = Dclz.new] = "Expected"

puts Dclz.new == Dclz.new             # => true
puts Dclz.new.hash == Dclz.new.hash   # => true

puts h[d]                             # => "Expected"
puts h[Dclz.new]                      # => "Failure"        huh????!!!!

And I cannot understand what's happening here. Someone, please confirm  
that I'm either sane or stupid?

(Tried on both ruby 1.8.3 (2005-09-21) [i386-linux] and ruby 1.9.0  
(2005-12-16) [i686-linux])

-- 
Ross Bamford - rosco / roscopeco.remove.co.uk