Как вы переопределяете оператор равенства регистров ruby?(===)
-
08-07-2019 - |
Вопрос
У меня есть класс, который я хочу сравнить как со строками, так и с символами в операторе case, поэтому я подумал, что я просто переопределю метод ===() для моего класса, и все будет в порядке.Однако мой метод ===() никогда не вызывается во время выполнения инструкции case .Есть какие-нибудь идеи?
Вот несколько примеров кода, и что происходит в сеансе 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 (основной):010:0> a=A.новый("привет")
=> #
irb (основной): 011:0> случай a
irb (main): 012:1> когда "привет", то 1
irb (основной): 013:1> остальное 2
irb (основной): 014:1> конец
=> 2
(он никогда не печатает сообщение и в любом случае всегда должен возвращать true) Обратите внимание, что в идеале я хотел бы сделать
def ===(other)
#puts "in ==="
return @x.===(other)
end
Заранее благодарю.
Решение
Выражение после ключевого слова 'case' находится в правой части выражения ===, а выражение после ключевого слова 'when' находится в левой части выражения.Итак, вызываемый метод - String.===, а не A.===.
Быстрый подход к обратному сравнению:
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