Subsecciones


Igualdad de Puntos

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

eql? y las Claves de un hash

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-06-18