2014-06-05 39 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'