如何引用哈希中键的值

我希望能够引用Hash一个键,这样如果该键的值发生变化,那么引用它的任何内容都会发生变化

 hash = {} hash[1] = "foo" hash[2] = hash[1] hash[1] = "bar" puts hash[2] # I want this to be "bar" 

这可能吗? 谢谢!

这是不可能的。 这是发生了什么:

 hash[1] = "foo" # hash[1] is now a reference to the object "foo". hash[2] = hash[1] # hash[2] is now a reference to the object "foo" as well, # since it is what hash[1] is a reference to. hash[1] = "bar" # hash[1] is now a reference to the object "bar" 

请注意,分配hash[1]不会更改它引用的对象,而只是更改它引用的对象。

在Ruby中(与许多高级语言一样),您没有指针,也没有明确的操作引用的能力。

但是,有一些方法是可变的,在String一个这样的例子是upcase! 。 在这个例子中,我们可以看到这个方法修改了被引用的实际对象而没有分配新对象(因此引用保持不变):

 hash[1] = "foo" #=> "foo" hash[2] = hash[1] #=> "foo" hash[2].upcase! #=> "FOO" hash # => {1=>"FOO", 2=>"FOO"} 

如果使用对象包装器,则可以:

 class A attr_accessor :a def initialize(a) @a = a end end hash = {} hash[1] = A.new("before") hash[2] = hash[1] hash[1].a = "after" puts hash[2].a # => "after 

这就是为什么要upcase! 工作 – 你不改变参考,但反对自己。 据我所知,在Rails中使用类似的机制来在控制器和视图之间传递参数。