Правильная реализация и использование оператора == в ruby

В продолжение еще один вопрос Так же у меня есть следующий вопрос.

У меня есть класс, в котором есть очень центральная переменная экземпляра, называемая var. Это настолько важно для класса, что когда я печатаю объект класса, он должен просто печатать переменную экземпляра.

Когда я сравниваю тот же объект со строкой, которая соответствует переменной экземпляра, я бы хотел, чтобы она возвращала true, но это не всегда работает в приведенной ниже реализации:

class MyClass
    attr_accessor :var
    def initialize(v)
        @var = v
    end
    def to_s
        @var.to_s
    end
    def inspect
        @var.inspect
    end
    def ==(other)
        self.var == other
    end
    # ... methods to manipulate @var
end

str = "test"
obj = MyClass.new("test")

puts obj # prints the var string - great this is what i want
p obj # prints the var string - great this is what i want
puts obj==str # returns true - great this is what i want 
puts str==obj # returns false - oops! Fails since i didn't overload the == operator in String class. What to do? I don't think i want to "monkey patch" the String class.

Я понимаю, что используется не мой перезаписанный оператор ==. Это тот, который находится в классе String. Что вы предлагаете мне сделать, чтобы обойти это? Я иду по неправильному пути?

Я прочитал вопрос В чем разница между equal?, eql?, === и ==? не получив ответа на свой вопрос.

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
1
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
Я понимаю, что используется не мой перезаписанный оператор ==. Это тот, который находится в классе String. Что вы предлагаете мне сделать, чтобы обойти это? Я иду по неправильному пути?

Прежде чем пробовать что-либо еще, ознакомьтесь с документацией для String#==:

Если объект не является экземпляром String, но отвечает на to_str, то две строки сравниваются с использованием object.==.

Другими словами: вы должны реализовать to_str и вернуть строковое значение объекта:

class MyClass
  # ...

  def to_str
    @var.to_s
  end
end

Вы также можете вернуть to_s или использовать alias to_str to_s.

С любым из вышеперечисленных вы получите:

"test" == MyClass.new("test")
#=> true

Обратите внимание, что to_str должен быть реализован только объектами, подобными строке.

Другие вопросы по теме