话所 rubykoans 真是不错的锻炼 ruby 基础的习题集,下面是我在做 koans 的过程中出现的问题,请问这是什么原理?
hash = Hash.new([]) hash[:one] << "uno" hash[:two] << "dos" assert_equal ["uno", "dos"], hash[:one] assert_equal ["uno", "dos"], hash[:two] assert_equal ["uno", "dos"], hash[:three]
那个 Hash.new([]) 里的 [] 相当于是 hash 的默认值,就是在用 hash[xx] 的方法取数据但不存在该 key 时返回的默认值,如果用 hash = Hash.new, 相当于 hash = Hash.new(nil),所以一般的声明方法在取非预期值时会返回 nil
Hash.new([])
[]
hash
hash[xx]
hash = Hash.new
hash = Hash.new(nil)
nil
哦 发现了 原来每次传入的默认值 Hash 在用之前是不会拷贝一份的啊 所以会反复对传入的[]插入元素
Hash.new(|h, k| h[k] = []) 这样就好了
Hash.new(|h, k| h[k] = [])
学到了。