Wie überschreiben Sie den Rubin Fall Gleichheitsoperator? (===)
-
08-07-2019 - |
Frage
Ich habe eine Klasse, die ich beide Saiten und Symbole in einem Fall Aussage vergleichen wollen, so dachte ich, dass ich außer Kraft setzen nur die === () -Methode für meine Klasse und alles Gold sein würde. Jedoch meine === () Methode nie während der Case-Anweisung aufgerufen wird. Irgendwelche Ideen?
Hier ist ein Beispiel-Code, und was passiert in einer irb Sitzung:
class A
def initialize(x)
@x=x #note this isn't even required for this example
end
def ===(other)
puts "in ==="
return true
end
end
irb (main): 010: 0> a = A.new ( "hallo")
=> #
irb (main): 011: 0> Fall ein
irb (main): 012: 1>, wenn "hallo", dann 1 | irb (main): 013: 1> sonst 2
irb (main): 014: 1> Ende
=> 2
(druckt er nie die Nachricht und sollte immer true zurück sowieso) Beachten Sie, dass im Idealfall würde Ich mag ein tun
def ===(other)
#puts "in ==="
return @x.===(other)
end
Vielen Dank im Voraus.
Lösung
Der Ausdruck nach dem ‚Fall‘ Schlüsselwort ist die rechte Seite des === Ausdrucks und der Ausdruck nach dem ‚wann‘ Schlüsselwort ist auf der linken Seite des Ausdrucks. So ist die Methode, die aufgerufen wird, ist String. ===, nicht A. ===.
Eine schnelle Annäherung an die Umkehr der Vergleich:
class Revcomp
def initialize(obj)
@obj = obj
end
def ===(other)
other === @obj
end
def self.rev(obj)
Revcomp.new(obj)
end
end
class Test
def ===(other)
puts "here"
end
end
t = Test.new
case t
when Revcomp.rev("abc")
puts "there"
else
puts "somewhere"
end