2009-03-10 9 views
5

Tengo una clase que quiero comparar con cadenas y símbolos en una declaración de caso, así que pensé que simplemente anularía el método ===() para mi clase y todo sería oro. Sin embargo, mi método ===() nunca se llama durante la declaración de caso. ¿Algunas ideas?¿Cómo anula el operador de igualdad de casos de ruby? (===)

Aquí es un código de ejemplo, y lo que sucede en una sesión de 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 (principal): 010: 0> a = A.new ("Hola")
=> #
IRB (principal): 011: 0> caso, un
IRB (principal): 012: 1> cuando "Hola" y luego 1
IRB (principal): 013: 1> else 2
IRB (principal) : 014: 1> end
=> 2

(nunca se imprime el mensaje y siempre debe devolver verdadero de todos modos) Nota que, idealmente, me gustaría hacer un

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

Gracias de antemano.

Respuesta

7

La expresión después de la palabra clave 'case' es el lado derecho de la expresión ===, y la expresión después de la palabra clave 'when' está en el lado izquierdo de la expresión. Entonces, el método que se llama es String. ===, no A. ===.

Un enfoque rápido para revertir la comparación:

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

fresca. Eso lo explica, ¡y funciona! ¿Esta forma de hacer declaraciones de casos parece contra intuitiva? – Marcin

+0

Bueno. Sí, parece un poco desordenado, pero no le di mucha importancia a la sintaxis para esta respuesta. Probablemente pueda llegar a una sintaxis más concisa, o puede hacer algo malo como anular operador === en las clases que desea tener en el LHS. – janm

+0

Gracias - Puedo ser un poco más conciso, pero también me hace pensar que tal vez estoy usando la herramienta incorrecta (estuche) para el trabajo, pero funciona, así que gracias (debería haberlo preguntado ayer). – Marcin

Cuestiones relacionadas