在PHP中,我可以这样做:
$a = 1;
$c = 'a';
$$c = 2;
//now $a == 2
红宝石中有没有相应的东西?我的意思是,在这样的执行过程中让它取消引用变量的任何简单方法?我宁愿不使用eval,因为它看起来很乱 - 我已经确定eval不能被称为字符串的方法。
答案 0 :(得分:2)
这是可能的,但它有点复杂。,你实际上有两种可能性:
返回当前局部变量的名称。
fred = 1
for i in 1..10
# ...
end
local_variables #=> [:fred, :i]
返回局部变量符号的值。
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'