Rails源代码:以奇怪的方式初始化哈希?

时间:2011-11-05 22:30:39

标签: ruby-on-rails ruby

导航源中的

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

2 个答案:

答案 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)

查看ruby documentation for Hash

  

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"]