假设包含一个模块,而不是扩展,模块实例变量和类变量之间有什么区别?
我没有看到两者之间有任何区别.
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
我一直在模块中使用@ as @@,我最近看到其他代码在模块中使用@@.然后我想我可能一直在错误地使用它.
由于我们无法实例化模块,因此模块的@和@@之间必须没有区别.我错了吗?
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
在类中包含模块时,模块类变量和类方法未在类中定义.
解决方法
类变量可以在包含这些模块的模块和类之间共享.
module A @@a = 5 end class B include A puts @@a # => 5 end
同时,实例变量属于self.当您将模块A包含在B类中时,A的自身对象与B的自身对象不同,因此您将无法在它们之间共享实例变量.
module A @a = 5 end class B include A puts @a # => nil end