У меня есть класс, который я хочу сравнить с строками и символами в case 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.new ("привет")
=> #
IRB (основной): 011: 0> случай а
IRB (основной): 012: 1> когда "привет", а затем 1
IRB (основной): 013: 1> еще 2
IRB (основной) : 014: 1> конец
=> 2
(он никогда не печатает сообщение и всегда возвращает истину в любом случае) Обратите внимание, что в идеале я хотел бы сделать
def ===(other)
#puts "in ==="
return @x.===(other)
end
Спасибо заранее.
Круто. Это объясняет это, и это работает! Оказывается ли этот способ делать заявления о делах, кажется интуитивным? – Marcin
Хорошо. Да, это кажется немного беспорядочным, но я не придавал синтаксису большое значение для этого ответа. Возможно, вы, возможно, придумаете более сжатый синтаксис, или вы можете сделать что-то злое, как переопределить оператор === в классах, которые вы хотите иметь на LHS. – janm
Спасибо. Я могу быть немного более кратким, но это также заставляет меня думать, что я могу использовать неправильный инструмент (дело) для работы, но он действительно работает, поэтому спасибо (я должен был спросить это вчера). – Marcin