在下面的示例中,我将重新打开Module
类并设置实例变量。这可能会破坏"该类是否已经将这些实例变量用于其他内容以及如何避免这种情况?
class Module
def fields
@fields ||= []
end
def foo name
fields << name
end
end
到目前为止,我还没有遇到任何与上述类似的问题。然而,我的下一个例子显示了这可能是一个问题。
class Foo
def bar
@test = 1
end
def print
puts @test
end
end
class Foo
def oops
@test = 2
end
end
obj = Foo.new
obj.bar
obj.print #=> 1
# method that we added later sets instance variable
obj.oops #=> 2
obj.print
这让我担心。
答案 0 :(得分:1)
如果已经使用了那些实例,这可能会“破坏”该类 其他的变量以及如何避免?
1.9.3-p545 :003 > Module.new.instance_variables
=> []
1.9.3-p545 :004 > Module.new.instance_variable_defined? "@fields" => false
答案 1 :(得分:0)
以下是一个例子,它会改变什么以及什么不会
module Helper
@fields = '@fields defined in Helper'
def self.print_helper_fields
p @fields
end
def print
p @fields
end
end
class A
include Helper
attr_accessor :fields
end
class Module
def foo
@fields = '@fields changed in Module#foo'
end
end
a = A.new
a.fields = [1, 2, 3]
a.print # => [1, 2, 3]
Helper.print_helper_fields # => '@fields defined in Helper'
Helper.foo
a.print # => [1, 2, 3]
Helper.print_helper_fields # => '@fields changed in Module#foo'