假设包含模块而不是扩展模块,模块实例变量和类变量之间有什么区别?
我认为两者之间没有任何区别.
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
Run Code Online (Sandbox Code Playgroud)
我一直在模块中使用@ 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
Run Code Online (Sandbox Code Playgroud)
在类中包含模块时,模块类变量和类方法未在类中定义.
类变量可以在包含这些模块的模块和类之间共享.
module A
@@a = 5
end
class B
include A
puts @@a # => 5
end
Run Code Online (Sandbox Code Playgroud)
同时,实例变量属于self.如果包括模块A到类B,self对象A是不一样的selfB的对象,因此,你将无法在它们之间共享实例变量.
module A
@a = 5
end
class B
include A
puts @a # => nil
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
869 次 |
| 最近记录: |