我有一个值为数组的哈希值。 问题是我有一组键,其中组中两个键的值必须相同。
所以我需要确保散列是引用的散列而不是值,但不确定ruby的复制语义。
答案 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中的大多数对象都是如此,除了一些“直接”类型,例如Fixnum
和Float
。
因此,您可以根据需要使用Ruby来使用指向同一对象的两个哈希键来构建数据结构。请注意,如果您通过数据序列化进行往返,则可能无法保留此项,并且如果您将新对象分配给其中一个键,则不会保留它。
相关语言语义为:
Array
,Hash
和String
上的许多方法都会创建并返回新对象。某些方法出现在两个版本中,例map
和map!
,其中前一版本返回一个新对象,而后者则更改了该对象。