gpt4 book ai didi

ruby - default_proc 是如何工作的

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

以下代码摘自 RubyTapas 截屏视频,但对于我这样的人来说解释得不够充分。像这样设置哈希

config = Hash.new do |h,k|
h[k] = Hash.new(&h.default_proc)
end

允许以下列方式设置和访问值

config[:production][:database][:adapter] = 'mysql'
puts config[:production][:database][:adapter] # => "mysql"

当我这样做

puts config.inspect

它揭示了一个嵌套的散列。

{:production=>{:database=>{:adapter=>"mysql"}}}

但是,如果我修改代码(只是玩弄它)以删除 &h.default_proc

    config = Hash.new do |h,k|
h[k] = Hash.new() #&h.default_proc removed from parameter
end

我收到这个错误

 undefined method `[]=' for nil:NilClass (NoMethodError)

例如,当我这样做时,我不明白 Hash.new(&h.default_proc) 发生了什么

    config[:production][:database][:adapter] = 'mysql'
puts config[:production][:database][:adapter] # => "mysql"

你能分解一下吗,详细解释 block &hdefault_proc 在这个上下文中是如何工作的。还请解释当调用 proc 时是否可以。为什么需要 proc 才能完成这项工作

    config[:production][:database][:adapter] = 'mysql'

proc 是如何被调用的?我认为您必须执行 proc.call 才能实际调用 proc。

提前致谢

最佳答案

你理解错了。 &h 在此上下文中不是有意义的单元。它是 & 附加到 h.default_proc。那是一个proc h.default_proc 变成了一个block。类似的事情适用于 splat 运算符 *&* 的关联优先级始终在最后。原因很明显:否则没有任何意义。


假设你有:

config = Hash.new() # or `{}`

然后,每当您使用不存在的 key 访问 config 时,它将返回 nil,因此

config[:production][:database]

将返回错误,因为 [] 方法未在 config[:production] 上定义,它等于 nil。当你这样做时:

config = Hash.new do |h,k|
h[k] = Hash.new()
end

然后,将确保当您使用不存在的 key 访问 config 时,它会创建一个新的哈希值作为值。所以

config[:production][:database]

现在可以了,因为方法 [] 是在 config[:production] 上定义的,它等于新创建的散列 {} .但是,

config[:production][:database][:adapter]

将返回错误,因为 [] 方法未在 config[:production][:database] 上定义,等于 nil .如果你有:

config = Hash.new do |h,k|
h[k] = Hash.new(&h.default_proc)
end

那么,这意味着,当您使用不存在的 key 访问 config 时,例如:

config[:production]

这次创建的哈希会有一个default_proc设置为与config相同的,这意味着

config[:procuction][:database]

不是将 nil 返回给不存在的键调用的哈希,而是将另一个哈希返回给不存在的键调用的哈希。所以这一次,

config[:production][:database][:adapter]

不会返回错误。类似的事情发生在散列中的任意深度。

关于ruby - default_proc 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13734385/

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