获取全局变量指向的当前值

时间:2012-05-18 19:53:37

标签: ruby

我有一些像这样编写的代码

$var1 = 2
$var2 = 4
...

keywords = {"one" => $var1, "two" => $var2, ...}

问题是我想在哈希到keywords时获取存储在该变量中的值,但是当我需要时,ruby似乎没有重新评估变量。因此,如果在执行期间更改$var1keywords["one"]仍会返回原始值2

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

有很多全局变量(它们没有使用数组?),我不希望有多余的情况/何时或if / elsif阻塞。

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

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

2 个答案:

答案 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]。发生的是:

  1. 在内存中创建一个值2并设置变量foo以引用它。
  2. 创建一个新数组,其第一个插槽引用foo引用的值(即2),并设置变量bar以引用该数组。
  3. 在内存中创建一个值4,然后更改变量foo以引用它。
  4. 一些可变的对象类型。例如,您可以将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