Repáse la sección Igualdad de Objetos 10.8.5
def ==(o) # Is self == o? if o.is_a? Point # If o is a Point object @x==o.x && @y==o.y # then compare the fields. elsif # If o is not a Point false # then, by definition, self != o. end end
def ==(o) # Is self == o? @x == o.x && @y == o.y # Assume o has proper x and y methods rescue # If that assumption fails false # Then self != o end
class Point alias eql? == end
def eql?(o) if o.instance_of? Point @x.eql?(o.x) && @y.eql?(o.y) elsif false end end
El predicado eql?
es usado por Ruby para comparar las claves de un hash.
Por ello, si redefinimos eql?
en nuestra clase,
es conveniente que también definamos el método
hash
que es usado por Ruby para calcular el hashcode
del objeto.
Se debe cumplir siempre
que si dos objetos son iguales según eql?
entonces sus hashcodes
deben ser iguales.
No parece que sea una buena idea usar objetos mutables como índices de hashes. Si es el caso, es mejor congelar el objeto (véase la sección 10.8.12).
Véase el código en 14.1.6
def hash @x.hash + @y.hash end
def hash code = 17 code = 37*code + @x.hash code = 37*code + @y.hash # Add lines like this for each significant instance variable code # Return the resulting code end
Casiano Rodriguez León 2015-01-07