2014-06-05 38 views
0

在下面的示例中,我重新打开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 

这让我很担心。

回答

1

可这有可能“破”之类的,如果它已经使用这些实例变量 别的东西,这怎么可能避免?

1.9.3-p545 :003 > Module.new.instance_variables 
=> [] 


1.9.3-p545 :004 > Module.new.instance_variable_defined? "@fields" => false 
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'