【发布时间】:2014-09-16 23:23:04
【问题描述】:
每当使用默认值时,我都会尝试获取嵌套散列以输出不同的散列实例。
下面的代码崩溃(我自己检查实例是否相等):
def reset_region_data
@region_data = Hash.new(Hash.new)
# @region_data = Hash.new{ Hash.new } # Same result as the line above
# @region_data = Hash.new { |hash,new_key| hash[new_key] = {} } # Same problem as the above lines.
end
def foo
reset_region_data
raise if @region_data[0].hash == @region_data[1 * 50 + 1].hash # <<<<< crashes
end
foo
这很奇怪。那么哈希默认为所有相同的实例?但为什么呢?
但是这段代码没有:
a = Hash.new(Hash.new())
a[10][10] = 1
a[11][11] = 2
raise if a[10][10].hash == a[11][11].hash
p a[10][10]
而且这段代码也不会崩溃:
a = Hash.new(Hash.new())
a[10] = 1
a[11] = 2
raise if a[10].hash == a[11].hash
p a[10]
【问题讨论】:
-
您遇到了什么异常?你可能想要
Hash.new { Hash.new };否则,将创建一个散列并将其设置为散列的默认值。将为每个新的默认值调用块形式(并将返回一个新的哈希)。 -
我自己的加薪是个例外。因为我希望每个实例都不同。但由于某种原因,它们不是。每个@region_data[x] 都是相同的哈希...
-
使用指示的块形式。您现在正在创建一个散列并为每个默认值返回该散列。
-
内联
rescue的问题之一是它们可能会掩盖您遇到的错误。将@region_data = nil[] rescue reset_region_data更改为@region_data = nil[],我相信你会得到异常,NoMethodError: undefined method [] for nil:NilClass。nil[]毫无意义。 -
您可能想检查例如
a[10].object_id而不是a[10].hash- 如果我是对的,请更新您的问题,或者详细说明为什么要使用哈希方法。相同的值具有相同的hash,但这并不一定意味着它们引用的是同一个对象(尽管在您的示例中它们实际上是,请参阅我的答案)。
标签: ruby hash instance default