:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb
可以看到以下内容
@load_hooks = Hash.new {|h,k| h[k] = [] }
在IRB中只是初始化一个空哈希。与
有什么不同@load_hooks = Hash.new
答案 0 :(得分:4)
区别在于处理缺失值。第一个返回空Array
,第二个返回nil
:
irb(main):001:0> a = Hash.new {|h,k| h[k] = [] }
=> {}
irb(main):002:0> b = Hash.new
=> {}
irb(main):003:0> a[123]
=> []
irb(main):004:0> b[123]
=> nil
以下是文档的链接:http://www.ruby-doc.org/core-1.9.3/Hash.html#method-c-new
答案 1 :(得分:4)
new→new_hash点击切换来源
new(obj)→new_hash
new {| hash,key |阻止}→new_hash返回一个新的空哈希。如果随后通过与散列条目不对应的键访问此散列,则返回的值取决于用于创建散列的新样式。在第一种形式中,访问返回nil。如果指定了obj,则此单个对象将用于所有默认值。如果指定了一个块,它将使用哈希对象和键调用,并应返回默认值。如果需要,块负责将值存储在哈希中。 示例构成文档
# 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"]