기본값을 사용할 때마다 해시의 다른 인스턴스를 출력하기 위해 중첩 해시를 얻으려고합니다.해시 default-value가 동일한 인스턴스를 모두 만듭니다.
(인스턴스가 동일한 경우는 확인 내 자신의 인상에) 충돌 아래 코드 :
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]
그리고이 코드는 충돌하지 않는 : 당신이 Hash.new
을주는 경우에
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]는 동일한 해시입니다 ... – Napoleon
표시된대로 블록 양식을 사용하십시오. 당신은 하나의 해시를 만들고 모든 기본값에 대해 그 해시를 반환하고 있습니다. –