Ruby local_variables返回:符号?

我正在浏览ruby Kernel doc并看到了这个方法:

a = 2 local_variables # => [:a, :_] 

为什么会回归:a而不是? 我认为“:”是为符号保留的,但是符号:a不指向变量a也不指向它的赋值,2。

此外,我将如何通过此方法访问实际变量? 如在b = local_variables.first(将是2,但是:a)。

这种行为背后有原因,它是什么?

谢谢/

为什么会回归:a而不是? 我认为“:”是为符号保留的

这是预期的行为。 根据文件 :

返回当前局部变量的名称

所以是的,这只是返回一个符号数组。


此外,我将如何通过此方法访问实际变量?

正如Jonathan Camenisch所指出的,Ruby 2.1引入了Binding#local_variable_get

 a = 2 binding.local_variable_get(:a) #=> 2 

对于较旧的Rubies,您可以使用eval

 a = 2 eval(:a.to_s) #=> 2 

这种行为背后有原因,它是什么?

在Ruby中,符号用于引用:

 "foo".methods #=> [:<=>, :==, :===, :eql?, :hash, :casecmp, ...] Module.constants #=> [:Object, :Module, :Class, :BasicObject, :Kernel, :NilClass, ...] 

为什么会回归:a而不是?

它不能返回a ,因为a是变量而变量不是Ruby中的对象。 方法只能获取,返回和操作对象。

我将如何通过此方法访问实际变量?

嗯,你可以去: –

 a = 2 b = 10 local_variables.each{|e| p eval(e.to_s)} # >> 2 # >> 10 

为什么会回归:a而不是?

@Stefan给出了答案 。 但你可以在这里获得更多的口味: –

13 Ways of Looking at a Ruby Symbol

其中以下与您的答案有关: –

7. Ruby符号是Ruby标识符

在Ruby中,我们可以在程序运行时查找标识符(变量,方法和常量名称)。 这通常使用符号来完成。

 class Demo # The stuff we'll look up. DEFAULT = "Hello" def initialize @message = DEFAULT end def say() @message end # Use symbols to look up identifiers. def look_up_with_symbols [Demo.const_get(:DEFAULT), method(:say), instance_variable_get(:@message)] end end Demo.new.look_up_with_symbols