Como você substituir o operador rubi caso igualdade? (===)
-
08-07-2019 - |
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.
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