Как вы переопределяете оператор равенства в рубине? (===) - PullRequest
6 голосов
/ 10 марта 2009

У меня есть класс, который я хочу сравнить со строками и символами в выражении 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.new ("привет")
=> #
irb (основной): 011: 0> case a
irb (основной): 012: 1> когда "привет", то 1
irb (основной): 013: 1> еще 2
irb (основной): 014: 1> end
=> 2

(оно никогда не печатает сообщение и всегда должно возвращать true) Обратите внимание, что в идеале я хотел бы сделать

def ===(other)
          #puts "in ==="
          return @x.===(other)
end

Заранее спасибо.

1 Ответ

8 голосов
/ 10 марта 2009

Выражение после ключевого слова '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
...