假设一个模块被包含,而不是扩展,模块实例变量和类变量有什么区别?
我看不出两者有什么区别。
module M
@foo = 1
def self.foo
@foo
end
end
p M.foo
module M
@@foo = 1
def self.foo
@@foo
end
end
p M.foo
我一直在模块中使用@ 作为@@,最近我看到其他代码在模块中使用@@。然后我想我可能用错了。
由于我们无法实例化模块,因此模块的 @ 和 @@ 之间必须没有区别。我错了吗?
----------------------- 添加了以下内容 --------------------
为了回答关于评论和帖子的一些问题,我还测试了以下内容。
module M
@foo = 1
def self.bar
:bar
end
def baz
:baz
end
end
class C
include M
end
p [:M_instance_variabies, M.instance_variables] # [@foo]
p [:M_bar, M.bar] # :bar
c = C.new
p c.instance_variables
p [:c_instance_variabies, c.instance_variables] # []
p [:c_baz, c.baz] :baz
p [:c_bar, c.bar] # undefined method
当您在类中包含模块时,模块类变量和类方法未在类中定义。