2009-03-10 13 views
5

Mam klasę, którą chcę porównać do obu łańcuchów i symboli w przypadku sprawy, więc pomyślałem, że po prostu przesłonię metodę ===() dla mojej klasy i wszystko będzie złote. Jednak moja metoda ===() nigdy nie jest wywoływana podczas instrukcji case. Jakieś pomysły?Jak przesłonić operatora równości rubinów? (===)

Oto przykład kodu, a co dzieje się w IRB sesji:

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 ("hi")
=> #
IRB (główny): 011: 0> to przypadku
IRB (główny): 012: 1> gdy "m", a następnie 1
IRB (główny): 013: 1> jeszcze 2
IRB (główny) : 014: 1> koniec
=> 2

(nie wypisuje komunikat i powinien zawsze zwracają prawdę tak) Zauważ, że idealnie chciałbym zrobić

def ===(other) 
      #puts "in ===" 
      return @x.===(other) 
end 

góry dziękuję.

Odpowiedz

7

Wyrażenie po słowie kluczowym "case" jest po prawej stronie wyrażenia ===, a wyrażenie po słowie "kiedy" znajduje się po lewej stronie wyrażenia. Metoda, która jest wywoływana, to String. ===, a nie A. ===.

Szybkie podejście do odwrócenia porównania:

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 
+0

cool. To wyjaśnia i działa! Czy ten sposób wykonywania spraw wydaje się sprzeczny z intuicją? – Marcin

+0

Dobrze. Tak, to wydaje się trochę nieporządne, ale nie dałem wiele uwagi na tę odpowiedź. Prawdopodobnie możesz wymyślić jakąś bardziej zwięzłą składnię, lub możesz zrobić coś złego, np. Przesłonić operatora === w klasach, które chcesz mieć na LHS. – janm

+0

Dzięki - mogę być trochę bardziej zwięzły, ale także sprawia, że ​​myślę, że może używam niewłaściwego narzędzia (przypadku) do pracy, ale to działa, więc dziękuję (powinienem był o to poprosić wczoraj). – Marcin

Powiązane problemy