Ruby local_variables返回:符号?

时间:2013-09-04 15:42:30

标签: ruby local-variables

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

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

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

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

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

感谢/

3 个答案:

答案 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