2013-03-13 2 views
0

초기화의 차이점에 대한 문서가 있습니까? 해시의 문서에는 차이점을 설명하는 내용이 없습니다.해시 초기화의 기능상 차이점은 무엇입니까?

foo = [1,2,3,4] 
test1 = Hash.new([]) 
test2 = Hash.new{|h,k| h[k] = []} 

foo.each do |i| 
    test1[i] << i 
    test2[i] << i 
end 

puts "test 1: #{test1.size}" #0 
puts "test 2: #{test2.size}" #4 

답변

3

이 문서에서이 언급되어있다. the doc 읽기 : OBJ가 지정되면

new(obj) → new_hash 
new {|hash, key| block } → new_hash 

[...]이 하나의 목적은 모든 기본 값에 사용됩니다. 블록이 지정되면 해시 객체와 키를 사용하여 호출되며 기본값을 반환해야합니다. 필요한 경우 해시에 값을 저장하는 것은 블록의 책임입니다.

h = Hash.new("Go Fish") 
h["a"] = 100 
h["b"] = 200 
h["a"]   #=> 100 
h["c"]   #=> "Go Fish" 
# The following alters the single default object 
h["c"].upcase! #=> "GO FISH" 
h["d"]   #=> "GO FISH" 
h.keys   #=> ["a", "b"] 

# While this creates a new default object each time 
h = Hash.new { |hash, key| hash[key] = "Go Fish: #{key}" } 
h["c"]   #=> "Go Fish: c" 
h["c"].upcase! #=> "GO FISH: C" 
h["d"]   #=> "Go Fish: d" 
h.keys   #=> ["c", "d"] 
+0

감사합니다. 나는 그 직전에 갔다 :/죄송합니다! – cgr

1

이것은 일반적인 잡았다. test1 (비 블록)을 사용하면 키가 해시에 존재하지 않을 때 얻을 수있는 기본 객체를 수정합니다.

foo = [1,2,3,4] 
test1 = Hash.new([]) 
test2 = Hash.new{|h,k| h[k] = []} 

foo.each do |i| 
    test1[i] << i 
    test2[i] << i 
    p test1['doesnotexist'] #added line 
end 

puts "test 1: #{test1.size}" #0 
puts "test 2: #{test2.size}" #4 

출력 :

[1] 
[1, 2] 
[1, 2, 3] 
[1, 2, 3, 4] 
test 1: 0 
test 2: 4 
1

차이가있다, 어떤 상황에서이

test1 = Hash.new([]) 
test2 = Hash.new{|h,k| h[k] = []} 

test1['foo'] #=> [] 
test2['foo'] #=> [] 

test1.keys == test2.keys #=> false 

첫 번째 건설 그냥 기본값을 반환하지만 현재의 해시하지만 두 번째 건축과 해시 아무것도를 초기화하지 않습니다 중요 할 수있다 키/값으로 값은 주어진 블록에 의해 계산됩니다.

관련 문제