gpt4 book ai didi

Ruby:行 "m = Hash.new {|h,k| h[k] = []}"完成了什么而 "Hash.new"没有完成?

转载 作者:数据小太阳 更新时间:2023-10-29 07:11:34 25 4
gpt4 key购买 nike

一边学习this 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

我的问题是关于第三行。什么是传递 block {|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。包含该 block 的背后原因是什么?

最佳答案

它允许你将默认值定义为一个数组

h = Hash.new { |h, k| h[k] = [] }
h[:a] # => {:a=>[]}
h[:b] << 123 # => {:a=>[], :b=>[123]}

这里有更多示例:Hash.new

关于Ruby:行 "m = Hash.new {|h,k| h[k] = []}"完成了什么而 "Hash.new"没有完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20278264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com