在MRI Ruby 2.0+中 - 模块一次加载到内存中吗?

时间:2015-11-20 22:54:56

标签: ruby-on-rails ruby memory

如果你在Ruby中有一个模块,你期望那个特定的对象(因为一切都是Ruby中的一个对象)没有任何实例。那么解释器中分配的内存消耗情况如何呢?我知道对于Ruby符号,例如解释器将加载该常量的一个实例,并且每次在其外部引用时重用该内存。它是否与Module对象类似?

2 个答案:

答案 0 :(得分:0)

Ruby语言规范没有说明如何分配内存。每个实现者都可以根据自己的意愿自由选择内存分配策略,内存管理策略,对象表示,内存优化等。只要他们在内部表现相同,他们就可以做任何他们想做的事。

答案 1 :(得分:0)

我认为您正在寻找的答案是:模块/类名称在Ruby中是一种常量,它与符号类似,因为给定名称只有一个模块“实例”。不同之处在于模块(和类)可以​​重复重新打开和修改,例如(在我的机器和MRI / YARV 2.2.3上):

module Foo
  def a; end
end

p Foo.object_id # < 47210744068460
p Foo.instance_methods(false) # < [:a]

module Foo
  def b; end
end

p Foo.object_id # < 47210744068460
p Foo.instance_methods(false) # < [:a, :b]

所以它是同一个对象,但随着时间的推移会改变状态。理论上,你可以一次又一次地保持load包含模块定义的同一文件,每次Ruby都会评估它并覆盖前一个定义的属性。 (这就是你应该使用require的原因;如果文件已被加载,它将不会重新加载文件。)它不会创建新模块并消耗额外的内存。