Ruby中的哈希值存储为副本?

时间:2014-01-28 04:47:27

标签: ruby hash

当我运行下面的内容时,我得到了

false
false

作为输出。我希望这样做:

false
true
true

代码:

a = Object.new
b = Object.new

my_hash = {}
my_hash['one'] = [a, b]
my_hash['two'] = [b]

my_hash.each do |key, value|
  puts value == b
end

迭代器中“value”中引用的对象似乎与“a”和“b”相同。为什么呢?

2 个答案:

答案 0 :(得分:3)

代码将数组(散列值)与对象b进行比较。

您应该比较每个数组项目以获得预期结果:

a = Object.new
b = Object.new

my_hash = {}
my_hash['one'] = [a, b]
my_hash['two'] = [b]

my_hash.each do |key, array|
  array.each do |item| # <---
    puts item == b
  end                 # <---
end

outupt:

false
true
true

答案 1 :(得分:1)

在散列上调用each不会迭代作为值的数组。

所以my_hash.each正在有效运行:

 [a, b] == b #=> false
 [b] == b #=> false

http://www.ruby-doc.org/core-2.1.0/Hash.html#method-i-each