对于类变量,分配klass.foo = 'bar'
实际上是调用klass.foo=(bar)
方法的一些合成糖。但是如果我像这样分配一个局部变量:
irb(main):001:0> foo = 'bar'
=> "bar"
那么这个变量分配给哪个对象?这是否也在某处调用foo=
方法?我有点期待这个,因为:
在我看来,这有点暗示一个(或许是少数)"魔法"根对象,在其下定义其他所有东西(......但是这个心理图像可能是错误的......)
我试过了:
irb(main):002:0> Kernel.foo
NoMethodError: undefined method `foo' for Kernel:Module
irb(main):003:0> Object.foo
NoMethodError: undefined method `foo' for Object:Class
irb(main):004:0> self.foo
NoMethodError: undefined method `foo' for main:Object
这同样适用于以下代码:
def foo
a = 'bar'
puts self.a
end
foo
给了我:
a.rb:3:in `foo': undefined method `foo' for main:Object (NoMethodError)
from foo.rb:6:in `<main>'
答案 0 :(得分:5)
Ruby中有4种变量:local,instance,class和global。
def x
a = 1+2
end
a
是一个局部变量;它不是一个对象,而是一个存储对象3
的引用的地方。它也不需要一个对象来保持&#34; in(只是本地查找表/堆栈位于ruby解释器内部的某个深处)。
irb
相同。 (但请参阅spickermann的答案,了解有关irb
如何在内部将本地人从一个提示转移到下一个提示的更多信息。)
引用Everything in ruby is an object
并不意味着字面上所有都是一个对象。例如,一个方法不是一个对象(尽管你可以有一个类Method的对象,它指向一个方法定义 - 实际编译的代码)。方法调用不是对象。变量不是对象(尽管它指向到对象)。
答案 1 :(得分:4)
首先我们需要澄清一些事情:分配变量永远不会自动为该变量生成一个getter:
a = 1
a #=> 1
可是:
a = 1
self.a
#=> raises NoMethodError, because there is no `a` getter method defined on self.
回答你的问题:在当前的词法范围中定义了一个局部变量。在IRB中定义局部变量时,范围将为main
(Object
的实例):
# in irb
foo = 'Hello World'
self
#=> main
self.class
#=> Object < BasicObject
local_variables
#=> [:foo, ... ]
答案 2 :(得分:1)
该变量分配给哪个对象?
无。
这是否也在某处调用
foo=
方法?
不,没有涉及方法调用。
在Ruby中,一切都是对象。每一点信息和代码都可以赋予它们自己的属性和动作。
变量本身没有特定的类。他们只是提到一些对象。
在我看来,这会暗示一个(或许是几个)“神奇”的根对象,其中所有其他东西都被定义(......但是这个心理图像可能是错误的......)
在某种意义上,您可以说某些局部变量绑定到Binding
的实例。但是当前的绑定是由上下文切换的,并且没有上帝对象可以保存它们。