В продолжение еще один вопрос Так же у меня есть следующий вопрос.
У меня есть класс, в котором есть очень центральная переменная экземпляра, называемая 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?, === и ==? не получив ответа на свой вопрос.
Я понимаю, что используется не мой перезаписанный оператор ==. Это тот, который находится в классе 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 должен быть реализован только объектами, подобными строке.