Как вы переопределяете оператор равенства регистров ruby?(===)

StackOverflow https://stackoverflow.com/questions/629669

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top