- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
以下代码摘自 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/
以下代码摘自 RubyTapas 截屏视频,但对于我这样的人来说解释得不够充分。像这样设置哈希 config = Hash.new do |h,k| h[k] = Hash.new(&h.defa
我想扩展 Hash 类,以便所有哈希在创建时都具有相同的 default_proc。所以我把它放在我的文件中: class Hash def initialize self.default
我是一名优秀的程序员,十分优秀!