打破重新开课

时间:2014-06-05 00:16:22

标签: ruby

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

这让我担心。

2 个答案:

答案 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'