2009-03-10 7 views
5

Ho una classe che voglio confrontare sia con stringhe che con simboli in un'istruzione case, quindi ho pensato di scavalcare il metodo ===() per la mia classe e tutto sarebbe oro. Tuttavia il mio metodo ===() non viene mai chiamato durante la dichiarazione del caso. Qualche idea?Come si ignora l'operatore di uguaglianza caso rubino? (===)

Ecco qualche esempio di codice, e ciò che accade in una sessione IRB:

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 (principale): 010: 0> a = A.new ("ciao")
=> #
IRB (principale): 011: 0> caso un
IRB (principale): 012: 1> quando "hi" poi 1
IRB (principale): 013: 1> altro 2
IRB (principale) : 014: 1> fine
=> 2

(mai stampa il messaggio e dovrebbe sempre return true comunque) Nota che idealmente mi piacerebbe fare un

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

Grazie in anticipo.

risposta

7

L'espressione dopo la parola chiave 'caso' è il lato destro dell'espressione === e l'espressione dopo la parola chiave 'when' si trova sul lato sinistro dell'espressione. Quindi, il metodo che viene chiamato è String. ===, non A. ===.

Un approccio rapido per invertire il confronto:

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. Questo lo spiega e funziona! Questo modo di fare le affermazioni del caso sembra controintuitivo? – Marcin

+0

Buono. Sì, sembra un po 'complicato, ma non ho pensato molto alla sintassi per questa risposta. Probabilmente puoi trovare una sintassi più concisa, oppure puoi fare qualcosa di male come l'operatore override === nelle classi che vuoi avere sul LHS. – janm

+0

Grazie - Posso essere un po 'più conciso, ma mi fa anche pensare che forse sto usando lo strumento sbagliato (caso) per il lavoro, ma funziona, quindi grazie (avrei dovuto chiederlo ieri). – Marcin