我正在查看 ruby Kernel 文档并看到了这个方法:
a = 2
local_variables # => [:a, :_]
为什么它返回:a 而不是 a?我认为“:”是为符号保留的,但符号 :a 既不指向变量 a,也不指向它的赋值 2。
此外,我将如何通过这种方法访问实际变量?如 b=local_variables.first (应该是 2,但是是 :a)。
这种行为背后是否有原因,是什么?
谢谢/
我正在查看 ruby Kernel 文档并看到了这个方法:
a = 2
local_variables # => [:a, :_]
为什么它返回:a 而不是 a?我认为“:”是为符号保留的,但符号 :a 既不指向变量 a,也不指向它的赋值 2。
此外,我将如何通过这种方法访问实际变量?如 b=local_variables.first (应该是 2,但是是 :a)。
这种行为背后是否有原因,是什么?
谢谢/
为什么它返回:a 而不是 a?我认为“:”是为符号保留的
这是预期的行为。根据文档:
返回当前局部变量的名称。
所以是的,这只是返回一个符号数组。
此外,我将如何通过这种方法访问实际变量?
正如 Jonathan Camenisch 所说,Ruby 2.1 引入了Binding#local_variable_get
:
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, ...]
为什么它返回:a 而不是 a?
它不能 return a
,因为a
它是一个变量,而变量不是 Ruby 中的对象。方法只能获取、返回和操作对象。
我将如何通过这种方法访问实际变量?
嗯,你可以去:-
a = 2
b = 10
local_variables.each{|e| p eval(e.to_s)}
# >> 2
# >> 10
为什么它返回:a 而不是 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