我需要建立一些Hashes,我不想像这样每行列出一个
a = Hash.new
b = Hash.new
我还知道,除了 Fixnums,我不能这样做
a = b = Hash.new
因为 a 和 b 都引用同一个对象。我能做的就是这个
a, b, = Hash.new, Hash.new
如果我有一堆好像我也能做到这一点
a, b = [Hash.new] * 2
这适用于字符串,但对于哈希,它们仍然都引用同一个对象,尽管
[Hash.new, Hash.new] == [Hash.new] * 2
和前者的作品。
请参阅下面的代码示例,触发的唯一错误消息是“乘法散列损坏”。只是好奇这是为什么。
a, b, c = [String.new] * 3
a = "hi"
puts "string broken" unless b == ""
puts "not equivalent" unless [Hash.new, Hash.new, Hash.new] == [Hash.new] * 3
a, b, c = [Hash.new, Hash.new, Hash.new]
a['hi'] = :test
puts "normal hash broken" unless b == {}
a, b, c = [Hash.new] * 3
a['hi'] = :test
puts "multiplication hash broken" unless b == {}
在回答最初的问题时,初始化多个副本的一种简单方法是使用 Array.new(size) {|index| block }
Array.new 的变体
a, b = Array.new(2) { Hash.new }
a, b, c = Array.new(3) { Hash.new }
# ... and so on
附带说明一下,除了赋值混淆之外,原始文件的另一个看似问题是您可能犯了一个错误,即 ==
正在比较 的对象引用code>Hash
和 String
。需要明确的是,事实并非如此。
# Hashes are considered equivalent if they have the same keys/values (or none at all)
hash1, hash2 = {}, {}
hash1 == hash1 #=> true
hash1 == hash2 #=> true
# so of course
[Hash.new, Hash.new] == [Hash.new] * 2 #=> true
# however
different_hashes = [Hash.new, Hash.new]
same_hash_twice = [Hash.new] * 2
different_hashes == same_hash_twice #=> true
different_hashes.map(&:object_id) == same_hash_twice.map(&:object_id) #=> false
我是一名优秀的程序员,十分优秀!