如何引用哈希中键的值

时间:2011-12-05 00:40:28

标签: ruby

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

hash = {}

hash[1] = "foo"
hash[2] = hash[1]

hash[1] = "bar"

puts hash[2] # I want this to be "bar"

这可能吗?谢谢!

2 个答案:

答案 0 :(得分:1)

这是不可能的。以下是发生的事情:

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 1上这样的例子是upcase!。在这个例子中,我们可以看到这个方法修改了被引用的实际对象而没有分配一个新对象(因此引用保持不变):

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

答案 1 :(得分:1)

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

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中使用了类似的机制来在控制器和视图之间传递参数。