Pergunta

Eu tenho uma classe que eu quero comparar a ambas as cordas e símbolos em um comunicado caso, então eu pensei que eu só substituir o método === () para minha classe e tudo estaria ouro. minha === (método no entanto) nunca é chamado durante a instrução case. Alguma idéia?

Aqui está um exemplo de código, e o que acontece em uma sessão 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 (main): 010: 0> a = A.new ( "oi")
=> #
irb (main): 011: 0> caso um
irb (main): 012: 1> quando "oi", em seguida, 1 | irb (main): 013: 1> else 2 | irb (main): 014: 1> end
=> 2 |

(nunca imprime a mensagem e sempre deve retornar verdadeiro de qualquer maneira) Nota que, idealmente, eu gostaria de fazer um

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

Agradecemos antecipadamente.

Foi útil?

Solução

A expressão após a palavra-chave 'case' é o lado direito da expressão ===, ea expressão após a palavra-chave 'quando' está no lado esquerdo da expressão. Assim, o método que está sendo chamado é String. ===, não um. ===.

Uma abordagem rápida para reverter a comparação:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top