2

我有一些这样写的代码

$var1 = 2
$var2 = 4
...

关键字 = {"one" => $var1, "two" => $var2, ...}

问题是,当我散列到 时,我想获取存储在该变量中的值keywords,但是当我需要变量时,ruby 似乎并没有重新评估它们。所以如果$var1在执行过程中被改变了,keywords["one"]仍然返回原来的值2

如何更改哈希,以便我首先确定我需要访问哪个变量,然后去获取它的值?

有相当多的全局变量(它们没有使用数组?),我不想有多余的 case/when 或 if/elsif 块。

编辑:一个更精确的问题是

“如何检索变量当前指向的值?”

4

2 回答 2

3

一般来说,这似乎是个坏主意。而不是更新 $var1 只需更新哈希并始终通过关键字访问 $var1 ["one"]

您可以使用 eval,但这不是一个好的解决方案:

$var1 = 2
$var2 = 4
...
keywords = {"one" => "$var1", "two" => "$var2", ...}
$var1 = 6
var1 = eval(keywords["one"])  # -> 6

更新:请注意,eval 将获取您传入的任何代码并执行它。你需要非常小心,你正在评估的东西是你期望的形式。这可能是一个很大的安全风险。

于 2012-05-18T20:01:21.480 回答
1

变量不包含值,它们引用它们。当你写:

foo = 2
bar = [foo]
foo = 4

......它不会bar导致[4]。〜发生的是:

  1. 2在内存中创建一个值并设置变量foo以引用它。
  2. 创建一个新数组,其第一个槽引用foo(ie 2) 引用的值,并将变量设置bar为引用该数组。
  3. 在内存中创建一个值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

于 2012-05-18T19:58:28.010 回答