2012-05-22 7 views
5

Quiero implementar == para una clase de ruby. Puedo hacer¿Debe una implementación "==" en Ruby verificar el tipo?

def ==(o) 
    o.respond_to?(:id) && self.id == o.id 
end 

o

def ==(o) 
    o.is_a?(Foo) && self.id == o.id 
end 

Según this artículo, parece que el primero tendría más sentido. Si estuviera implementando eql?, haría lo segundo. ¿Es esto correcto?

+0

'==' no * significa * que tiene que trascender los tipos incluso si 'eql?' Tiene un requisito más específico. Sin embargo, podría ser útil que tenga una base más estructural, como se muestra. –

+0

@pst ¿Estás diciendo que usar 'responder_a?' Está bien? –

+0

¿Qué es 'id' en este escenario? ¿Es lo mismo que Object # object_id o es una identificación de registro activa o un acceso a una variable de instancia? –

Respuesta

1

Depende si está comparando con un objeto arbitrario o uno de un tipo específico. La segunda forma es específica, la primera es genérica.

En su caso, probablemente esté bien con el formulario específico. Las comparaciones genéricas solo son relevantes cuando el objeto con el que se compara puede convertirse o interpretarse como algo que puede coincidir. El uso de id parece demasiado abierto. Esto implicaría que Foo 10 y Bar 10 son equivalentes cuando podrían extraerse de fuentes completamente diferentes.

+1

Derecha. Creo que '.id' fue un mal ejemplo. Mi clase realmente busca '.job_id' –

Cuestiones relacionadas