有没有办法隐式评估ruby中的变量?

时间:2014-06-17 08:48:57

标签: ruby pointers eval dereference

在PHP中,我可以这样做:

$a = 1;
$c = 'a';
$$c = 2;
//now $a == 2

红宝石中有没有相应的东西?我的意思是,在这样的执行过程中让它取消引用变量的任何简单方法?我宁愿不使用eval,因为它看起来很乱 - 我已经确定eval不能被称为字符串的方法。

2 个答案:

答案 0 :(得分:2)

这是可能的,但它有点复杂。,你实际上有两种可能性:

Kernel#local_variables

返回当前局部变量的名称。

fred = 1
for i in 1..10
   # ...
end
local_variables   #=> [:fred, :i]

Binding#local_variable_get/set

返回局部变量符号的值。

def foo
  a = 1
  binding.local_variable_get(:a) #=> 1
  binding.local_variable_get(:b) #=> NameError
end

此方法是以下代码的简短版本。

binding.eval("#{symbol}")

答案 1 :(得分:0)

如果你需要这个,你可以做到

a = 1
c = 'a'
eval("#{c} = 2")
a == 2   # => true

......但这是实现这一目标的蠢货

如果你需要这个例如变量

class Foo
  attr_reader :a

  def initialize
    @a = 1
  end
end

foo = Foo.new
foo.instance_variable_get(:a)       #=> 1
foo.a                               #=> 1
foo.instance_variable_set(:"@a", 2)
foo.a                               #=> 2

...你也可以像这样评估实例:

# ...
foo.instance_eval do
  @a = 'b'
end
foo.a    # => 'b'