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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top