2012-05-22 3 views
5

Ich möchte == für eine Rubin-Klasse implementieren. Ich kann nach this ArtikelSollte eine "==" Implementierung in Ruby den Typ prüfen?

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

oder

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

tun, es scheint, dass die erstere würde mehr Sinn machen. Wenn ich eql? implementieren würde, würde ich das letztere tun. Ist das richtig?

+0

'==' bedeutet * nicht, dass es Typen transzendieren muss, selbst wenn 'eql?' Eine spezifischere Anforderung hat. Es kann jedoch nützlich sein, dass es strukturierter ist, wie gezeigt. –

+0

@pst Willst du sagen, dass 'respond_to? 'In Ordnung ist? –

+0

Was ist ID in diesem Szenario? Ist es das gleiche wie Object # object_id oder ist es eine aktive Record-ID oder ein Accessor für eine Instanzvariable? –

Antwort

1

Es hängt davon ab, ob Sie mit einem beliebigen Objekt oder einem bestimmten Typ vergleichen. Die zweite Form ist spezifisch, die erste generische.

In Ihrem Fall sind Sie wahrscheinlich mit der spezifischen Form in Ordnung. Generische Vergleiche sind nur relevant, wenn das Objekt, mit dem Sie vergleichen, konvertiert oder als etwas interpretiert werden kann, das übereinstimmen kann. Die Verwendung von id scheint viel zu offen zu sein. Dies würde bedeuten, dass Foo 10 und Bar 10 gleichwertig sind, wenn sie aus völlig verschiedenen Quellen stammen.

+1

Rechts. Ich denke, '.id' war ein schlechtes Beispiel. Meine Klasse sucht nach '.job_id' –