Ruby主类上的实例变量

Ruby主类上的实例变量,ruby,Ruby,考虑以下代码: @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,我想它应该是main@name的类变量,而@name是一个实例变量,@@

考虑以下代码:

@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
,我想它应该是
main
@name
类变量,而
@name
是一个实例变量,
@@name
将是一个类变量

在任何显式类定义之外定义实例变量时,隐式地位于
对象
空间内

➜  ~  irb
2.1.5 :001 > self.class
 => Object
2.1.5 :002 >
对象
是一个对象,或多或少类似于自定义对象。因此,当您创建

@name = 'learning metaprogramming!'

实例变量
@name
存在于
对象的范围内。方法定义发生在同一范围内,因此您可以访问实例变量。

那么什么是方法
cap
?它是
Object
的实例方法还是类方法?不,
@name
不存在于
Object
的范围内,它存在于
main
@JörgWMittag的范围内。我知道,这就是为什么我在
对象的范围内而不是在
对象的范围内使用的原因。如果你感到困惑,请随意重新表述。我相信我们的意思是一样的,只是可能缺乏英语沟通技巧@JikkuJose
cap
Object
@MarekLipka的私有实例方法,听起来很有意义;但我只是发现它令人困惑,因为方法的内部和外部如何具有相同的范围。定义方法的行为不会将
self
更改为当前范围的实例范围吗?