看代码:
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 的地方,理解不了。呵呵~~
这里有讨论过:http://ruby-china.org/topics/1591
用 block 做参数来创建一个 hash 的话,在每次用 Hash#[] 方法来读取一个 key 时,如果 Key 找不到,会自动调用你传入的 block。
具体到你的例子, hash[:one] << "uno"这行代码,发生的情况如下:
hash[:one] << "uno"
{|hash, key| hash[key] = [] }
hash[:one] = []
于是,hash[:one] 的值,就变成了 ["uno"]
["uno"]
@daqing 太感谢了,你的解释让我一下子就明白了。哈哈
确认一下,重点是让 block 和 new 这个函数建立了一个类似委托的关系,当每个元素都调用 new 的时候,那么就会调用 block 的代码。是这样的吧?
#4 楼 @mobiwolf 看一下 Hash#new 这个方法的文档吧,说的很清楚。
@daqing 嗯,好的。谢谢指点啊