0

是否有关于初始化差异的文档?Hash 上的文档没有任何可以解释差异的东西。

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
4

3 回答 3

3

文档中有提及。阅读文档

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

[...] 如果指定了 obj,则这个单一对象将用于所有默认值。如果指定了一个块,它将使用哈希对象和键调用,并且应该返回默认值。如果需要,将值存储在散列中是块的责任。

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"]
于 2013-03-13T22:31:51.390 回答
1

有区别,在某些情况下可能很重要

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

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

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

第一个构造只返回默认值,但不对当前散列做任何事情,但第二个构造使用键/值初始化散列,其中值由给定块计算。

于 2013-03-13T22:46:33.167 回答
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
于 2013-03-13T22:30:39.837 回答