在Ruby中创建引用的哈希

时间:2013-05-25 21:11:30

标签: ruby reference copy

我有一个值为数组的哈希值。 问题是我有一组键,其中组中两个键的值必须相同。

所以我需要确保散列是引用的散列而不是值,但不确定ruby的复制语义。

2 个答案:

答案 0 :(得分:3)

这有帮助吗?

a = %w(a b c) # create an array
p a # have a look at it
p a.object_id # this is how ruby references the array
# =>68669980
hash = {'a_key'=>a} #put it in a hash
p hash['a_key']# have a look at it again
p hash['a_key'].object_id # no copy, just a reference
# =>68669980

答案 1 :(得分:1)

这应该回答你关于数组的“参考哈希”的问题:

   array = [1,2]
   hash = { :k1 => array, :k2 => array }
   hash[:k1].push(3)
   puts hash[:k2].inspect
   => [ 1, 2, 3 ]

如您所见,数组变量是对Ruby中底层对象的引用。对于Ruby中的大多数对象都是如此,除了一些“直接”类型,例如FixnumFloat

因此,您可以根据需要使用Ruby来使用指向同一对象的两个哈希键来构建数据结构。请注意,如果您通过数据序列化进行往返,则可能无法保留此项,并且如果您将新对象分配给其中一个键,则不会保留它。

相关语言语义为:

  1. Ruby变量是对象的引用。
  2. 赋值给变量,数组元素或散列键不会复制对象,它会在变量中存储新的引用。
  3. 使用对象作为方法的参数不会创建副本,它会传递引用
  4. ArrayHashString上的许多方法都会创建并返回新对象。某些方法出现在两个版本中,例mapmap!,其中前一版本返回一个新对象,而后者则更改了该对象。
  5. 有一些例外情况:在分配时和传递给方法时 复制的“立即”对象。这包括内置数字类型。