¿Cómo anula el operador de igualdad de mayúsculas y minúsculas? (===)
-
08-07-2019 - |
Pregunta
Tengo una clase que quiero comparar tanto con cadenas como con símbolos en una declaración de caso, así que pensé que simplemente anulaba el método === () para mi clase y todo sería oro. Sin embargo, mi método === () nunca se llama durante la declaración del caso. ¿Alguna idea?
Aquí hay un código de ejemplo y lo que sucede en una sesión 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.nuevo (" hola ")
= > #
irb (principal): 011: 0 > caso un
irb (principal): 012: 1 > cuando " hola " entonces 1
irb (principal): 013: 1 > más 2
irb (principal): 014: 1 > fin
= > 2
(nunca imprime el mensaje y siempre debe ser verdadero de todos modos) Tenga en cuenta que, idealmente, me gustaría hacer un
def ===(other)
#puts "in ==="
return @x.===(other)
end
Gracias de antemano.
Solución
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