分配了哪个对象是局部变量?

时间:2016-03-11 09:02:20

标签: ruby

对于类变量,分配klass.foo = 'bar'实际上是调用klass.foo=(bar)方法的一些合成糖。但是如果我像这样分配一个局部变量:

irb(main):001:0> foo = 'bar'
=> "bar"

那么这个变量分配给哪个对象?这是否也在某处调用foo=方法?我有点期待这个,因为:

  

In Ruby, everything is an object. Every bit of information and code can be given their own properties and actions.

在我看来,这有点暗示一个(或许是少数)"魔法"根对象,在其下定义其他所有东西(......但是这个心理图像可能是错误的......)

我试过了:

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>'

3 个答案:

答案 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中定义局部变量时,范围将为mainObject的实例):

# in irb
foo = 'Hello World'
self
#=> main
self.class
#=> Object < BasicObject
local_variables
#=> [:foo, ... ]

答案 2 :(得分:1)

  

该变量分配给哪个对象?

无。

  

这是否也在某处调用foo=方法?

不,没有涉及方法调用。

  

在Ruby中,一切都是对象。每一点信息和代码都可以赋予它们自己的属性和动作。

变量本身没有特定的类。他们只是提到一些对象。

  

在我看来,这会暗示一个(或许是几个)“神奇”的根对象,其中所有其他东西都被定义(......但是这个心理图像可能是错误的......)

在某种意义上,您可以说某些局部变量绑定到Binding的实例。但是当前的绑定是由上下文切换的,并且没有上帝对象可以保存它们。