我正在查看ruby Kernel doc并看到了这个方法:
a = 2
local_variables # => [:a, :_]
为什么会回归:a而不是? 我认为“:”是为符号保留的,但是符号:a不指向变量a也不指向它的指定值,2。
此外,我将如何通过此方法访问实际变量?如在b = local_variables.first(将是2,但是:a)。
这种行为背后有什么原因,它是什么?
感谢/
答案 0 :(得分:6)
为什么会回归:a而不是?我认为“:”是为符号保留的
这是预期的行为。根据{{3}}:
返回当前局部变量的名称。
所以是的,这只会返回一个符号数组。
此外,我将如何通过此方法访问实际变量?
正如Jonathan Camenisch所说,Ruby 2.1引入了docs:
a = 2
binding.local_variable_get(:a)
#=> 2
对于较旧的红宝石,您可以使用eval
:
a = 2
eval(:a.to_s)
#=> 2
这种行为背后有什么原因,它是什么?
在Ruby中,符号用于引用:
"foo".methods
#=> [:<=>, :==, :===, :eql?, :hash, :casecmp, ...]
Module.constants
#=> [:Object, :Module, :Class, :BasicObject, :Kernel, :NilClass, ...]
答案 1 :(得分:3)
为什么会返回:a而不是?
它不能返回a
,因为a
是变量而变量不是Ruby中的对象。方法只能接受,返回和操作对象。
答案 2 :(得分:1)
嗯,你可以去: -我将如何通过此方法访问实际变量?
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