Из "Язык программирования Ruby" - О'Рейли, январь 2008
Как только объект испорчен, любые объекты, полученные из него, также будут испорчены.
Рассмотрим следующий пример кода:
class Person
attr_accessor :name
def initialize name
@name = name
end
end
Если я выполню следующее:
p = Person.new("John Doe")
p.tainted? # => false
p.taint
p.tainted? # => true
p.to_s # => <Person:0x000000014e0600 @name="John Doe">
p.to_s.tainted? # => true
до сих пор все в порядке.Метод to_s возвращает строковое представление объекта, и он портится, как и ожидалось.
Затем я переопределяю метод to_s следующим образом:
class Person
def to_s
@name
end
end
Теперь, когда я запускаю предыдущийпроверьте снова:
p.tainted? # => true
p.to_s # => "John Doe"
p.to_s.tainted? # => false
Метод to_s теперь генерирует неиспорченную строку.Что мне здесь не хватает?Есть ли способ вызвать супер, чтобы сохранить функциональность?Должен ли я объявлять возвращаемую строку как испорченную собой каждый раз, когда переопределяю метод, подобный этому?
class Person
def to_s
self.tainted? ? @name.taint : @name
end
end