3

我正在查看 ruby​​ Kernel 文档并看到了这个方法:

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

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

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

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

谢谢/

4

3 回答 3

8

为什么它返回: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, ...]
于 2013-09-04T15:53:43.330 回答
3

为什么它返回:a 而不是 a?

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

于 2013-09-05T00:04:14.040 回答
1

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

嗯,你可以去:-

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
于 2013-09-04T15:51:46.597 回答