我有一个哈希值是数组。问题是我有一组键,其中组中两个键的值必须相同。
所以我需要确保散列是引用而不是值的散列,但我不确定 ruby 的复制语义。
这有帮助吗?
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
这应该回答您关于数组的“引用哈希”的问题:
array = [1,2]
hash = { :k1 => array, :k2 => array }
hash[:k1].push(3)
puts hash[:k2].inspect
=> [ 1, 2, 3 ]
如您所见,数组变量是对 Ruby 中底层对象的引用。对于 Ruby 中的大多数对象都是如此,除了一些“立即”类型,例如Fixnum
和Float
。
因此,您可以根据需要将 Ruby 用于您的数据结构,其中两个哈希键指向同一个对象。请注意,如果您通过数据序列化进行往返,这可能不会保留,如果您将新对象分配给其中一个键,则不会保留。
相关的语言语义是:
Array
,Hash
并将String
创建和返回新对象。一些方法出现在两个版本中,例如map
和map!
,其中前一个版本返回一个新对象,而后者则更改该对象。