-1

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

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

4

2 回答 2

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
于 2013-05-25T21:48:56.117 回答
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. 上的许多方法ArrayHash并将String创建和返回新对象。一些方法出现在两个版本中,例如mapmap!,其中前一个版本返回一个新对象,而后者则更改该对象。
  5. 有一些例外:在分配时复制的“立即”对象以及传递给方法时。这包括内置的数字类型。
于 2013-05-25T21:49:12.903 回答