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