在研究这个Railscast时,我遇到了来自Rack的以下一些源代码:
def self.middleware @middleware ||= begin m = Hash.new {|h,k| h[k] = []} m["deployment"].concat [ [Rack::ContentLength], [Rack::Chunked], logging_middleware ] m["development"].concat m["deployment"] + [[Rack::ShowExceptions], [Rack::Lint]] m end end
我的问题是关于第三行.通过该块{|h,k| h[k] = []}
来Hash.new
完成什么?我在IRB中尝试过,它似乎没有做任何与常规不同的事情Hash.new
:
2.0.0p247 :003 > m1 = Hash.new => {} 2.0.0p247 :004 > m2 = Hash.new{|h,k| h[k] = []} => {} 2.0.0p247 :005 > m1 == m2 => true
...但是我猜猜写Rack的人比我更了解Ruby.包含该块的原因是什么?
它允许您将默认值定义为数组
h = Hash.new { |h, k| h[k] = [] } h[:a] # => {:a=>[]} h[:b] << 123 # => {:a=>[], :b=>[123]}
更多例子如下:Hash.new