Ruby 关于 hash 和 block 的问题

mobiwolf · 2012年03月08日 · 最后由 mobiwolf 回复于 2012年03月08日 · 3155 次阅读

看代码:

hash = Hash.new {|hash, key| hash[key] = [] }
hash[:one] << "uno"
hash[:two] << "dos"
assert_equal ["uno"], hash[:one]
assert_equal ["dos"], hash[:two]
assert_equal [], hash[:three]


帮忙重点解释一个 block 的地方,理解不了。呵呵~~

用 block 做参数来创建一个 hash 的话,在每次用 Hash#[] 方法来读取一个 key 时,如果 Key 找不到,会自动调用你传入的 block。

具体到你的例子, hash[:one] << "uno"这行代码,发生的情况如下:

  1. 读取 hash[:one] 的值
  2. 发现:one 这个 key 不存在,调用 block {|hash, key| hash[key] = [] }, 效果就是hash[:one] = [],然后返回 hash[:one] 的值,也就是一个数组
  3. 往 hash[:one] 这个数组中增加一个字符串"uno"

于是,hash[:one] 的值,就变成了 ["uno"]

@daqing 太感谢了,你的解释让我一下子就明白了。哈哈

确认一下,重点是让 block 和 new 这个函数建立了一个类似委托的关系,当每个元素都调用 new 的时候,那么就会调用 block 的代码。是这样的吧?

#4 楼 @mobiwolf 看一下 Hash#new 这个方法的文档吧,说的很清楚。

@daqing 嗯,好的。谢谢指点啊

需要 登录 后方可回复, 如果你还没有账号请 注册新账号