如果你在Ruby中有一个模块,你期望那个特定的对象(因为一切都是Ruby中的一个对象)没有任何实例。那么解释器中分配的内存消耗情况如何呢?我知道对于Ruby符号,例如解释器将加载该常量的一个实例,并且每次在其外部引用时重用该内存。它是否与Module对象类似?
答案 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
的原因;如果文件已被加载,它将不会重新加载文件。)它不会创建新模块并消耗额外的内存。