Comment remplacez-vous l'opérateur d'égalité de cas Ruby? (===)
-
08-07-2019 - |
Question
J'ai une classe que je veux comparer aux chaînes et aux symboles dans une instruction case, alors je pensais que je substituais simplement la méthode === () à ma classe et que tout serait doré. Cependant, ma méthode === () n'est jamais appelée au cours de l'instruction case. Des idées?
Voici un exemple de code et ce qui se passe dans une session 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 ("hi")
= > #
irb (principal): 011: 0 > cas a
irb (principal): 012: 1 > quand " salut " alors 1
irb (principal): 013: 1 > sinon 2
irb (principal): 014: 1 > fin
= > 2
(il n'imprime jamais le message et doit toujours retourner true de toute façon) Notez qu'idéalement, j'aimerais faire une
def ===(other)
#puts "in ==="
return @x.===(other)
end
Merci d'avance.
La solution
L'expression après le mot clé "case" est le côté droit de l'expression ===, et l'expression après le mot clé "quand" est située à gauche de l'expression. Ainsi, la méthode appelée est String. ===, pas A. ===.
Une approche rapide pour inverser la comparaison:
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