¿Debería una implementación "==" en Ruby verificar el tipo?

Quiero implementar == para una clase de rubí. puedo hacer

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 este artículo, parece que lo primero tendría más sentido. Si estuviera implementando eql? entonces yo haría lo último. ¿Es esto correcto?

preguntado el 22 de mayo de 12 a las 19:05

== no se personalizado que tiene que trascender tipos aunque eql? tiene un requisito más específico. Sin embargo, podría ser útil que tenga una base más estructural, como se muestra. -

@pst ¿Estás diciendo usando respond_to? esta bien? -

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? -

@AmirRaminfar Si desea permitir == para ser aplicado estructuralmente, entonces sí. Dicho esto, con la excepción de algo como ostruct, no puedo pensar fácilmente en una necesidad... pero la igualdad de objetos puede tipos de corte transversal. Solo asegúrese de que la semántica esté definida. (FWIW: he estado tratando .id as .x en mi cabeza; es decir, no relacionado con el ID del objeto). -

1 Respuestas

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

En su caso, probablemente esté bien con el formulario específico. Las comparaciones genéricas solo son relevantes cuando el objeto que está comparando se puede convertir o interpretar como algo que puede coincidir. Utilizando id parece demasiado abierto final. Esto implicaría que Foo 10 y Bar 10 son equivalentes cuando pueden provenir de fuentes completamente diferentes.

contestado el 22 de mayo de 12 a las 19:05

Correcto. creo .id fue un mal ejemplo. Mi clase realmente busca .job_id - Amir Raminfar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.