Загрязненный в Ruby объект возвращает не испорченную строку из to_s - PullRequest
1 голос
/ 09 марта 2012

Из "Язык программирования 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

1 Ответ

2 голосов
/ 09 марта 2012

Я бы переопределил Person # taint:

class Person
  def initialize(name)
    @name = name
  end

  def taint
    @name.taint
    super
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...