2009-03-10 3 views
5

У меня есть класс, который я хочу сравнить с строками и символами в 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 

Спасибо заранее.

ответ

7

Выражение после ключевого слова «case» является правой частью выражения ===, а выражение после ключевого слова «когда» находится в левой части выражения. Итак, метод, который вызывается, это 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 
+0

Круто. Это объясняет это, и это работает! Оказывается ли этот способ делать заявления о делах, кажется интуитивным? – Marcin

+0

Хорошо. Да, это кажется немного беспорядочным, но я не придавал синтаксису большое значение для этого ответа. Возможно, вы, возможно, придумаете более сжатый синтаксис, или вы можете сделать что-то злое, как переопределить оператор === в классах, которые вы хотите иметь на LHS. – janm

+0

Спасибо. Я могу быть немного более кратким, но это также заставляет меня думать, что я могу использовать неправильный инструмент (дело) для работы, но он действительно работает, поэтому спасибо (я должен был спросить это вчера). – Marcin

Смежные вопросы