请考虑以下代码:
@name = 'learning metaprogramming!'
def cap
@name.upcase # Was expecting to require @@name as the scopes are different like in a class
end
cap # => "LEARNING METAPROGRAMMING!"
有人可以解释一下,为什么我能够访问@name
,我认为该class
变量应该是main
。
答案 0 :(得分:3)
@name
是一个实例变量,@@name
是一个类变量。
在任何显式类定义之外定义实例变量时,隐式位于Object
空间内。
➜ ~ irb
2.1.5 :001 > self.class
=> Object
2.1.5 :002 >
Object
是一个对象,或多或少像一个自定义对象。因此,当您创建
@name = 'learning metaprogramming!'
实例变量@name
存在于Object
的范围内。方法定义发生在同一范围内,因此您可以访问实例变量。