来自"Ruby Programming Language" - O'Reilly, Jan 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方法现在生成了一个非污染的字符串。我在这里错过了什么?反正有没有调用super来保留功能?每次重新定义一个方法时,我是否必须声明返回的字符串是否被自己污染了?
class Person
def to_s
self.tainted? ? @name.taint : @name
end
end
答案 0 :(得分:2)
我会覆盖Person#taint:
class Person
def initialize(name)
@name = name
end
def taint
@name.taint
super
end
end