我有一些像这样编写的代码
$var1 = 2 $var2 = 4 ... keywords = {"one" => $var1, "two" => $var2, ...}
问题是我想在哈希到keywords
时获取存储在该变量中的值,但是当我需要时,ruby似乎没有重新评估变量。因此,如果在执行期间更改$var1
,keywords["one"]
仍会返回原始值2
如何更改哈希值,以便首先确定需要访问哪个变量,然后去获取其值?
有很多全局变量(它们没有使用数组?),我不希望有多余的情况/何时或if / elsif阻塞。
编辑:一个更精确的问题是
“如何检索变量当前指向的值?”
答案 0 :(得分:3)
总的来说,这似乎是一个坏主意。而不是更新$ var1只需更新哈希并始终通过关键字[“one”]
访问$ var1你可以使用eval,但这不是一个好的解决方案:
$var1 = 2
$var2 = 4
...
keywords = {"one" => "$var1", "two" => "$var2", ...}
$var1 = 6
var1 = eval(keywords["one"]) # -> 6
更新:请注意,eval将接收您传入的任何代码并执行它。你需要非常小心,你正在评估的东西是你期望的形式。这可能是一个很大的安全风险。
答案 1 :(得分:1)
变量不包含值,它们引用它们。当你写:
foo = 2
bar = [foo]
foo = 4
...它不会导致bar
成为[4]
。发生的是:
2
并设置变量foo
以引用它。foo
引用的值(即2
),并设置变量bar
以引用该数组。4
,然后更改变量foo
以引用它。一些可变的对象类型。例如,您可以将String或Array的实际内容更改为不同。在这种情况下,对该值的所有引用都反映了这一变化:
foo = "hello"
bar = [foo]
foo[0] = "j"
p bar #=> ["jello"]
然而,数字并不可变。如果您想要一个数字的“句柄”而不是您可以更改并且对该数字的所有其他引用都更改,则需要将该数字包装在可变数据类型中。例如:
$var1 = [2]
keywords = { "one"=>$var1 }
p keywords["one"][0] #=> 2
$var1[0] = 4
p keywords["one"][0] #=> 4
现在,如果您的值不是数字,但是是字符串(如“关键字”所暗示的那样),那么您可以改变并完全替换它们:
$var1 = "foo"
keywords = { "one"=>$var1 }
$var1.replace( "bar" )
p keywords["one"] #=> "bar"
关键是你必须在对象本身上调用一个方法(并且该方法必须改变对象本身,而不是返回一个新对象);你不能使用变量赋值来完成这项工作。例如,请参阅String#replace
。