Ruby Hash.new 的疑问

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

如果是要创建 N 多类似的 k-v 对,那么 Hash.new(XXX),这里 XXX 是某个默认值。 可以是字符串,或者是数组等。 这样就会生成 N 多个名值对,现在问题就来了。

hash = Hash.new("rubychina")

hash[:one] hash[:two] hash[:ZZZ]

可以读取出了很多个。 但是: hash.fetch(:one) 就出错了。

问题和我之前的http://ruby-china.org/topics/1707这个有一点重合。

问题来了: 1,这样是无限制的吗?是根据内存的限制,还是说有什么规则呢?

2,为什么 [] 可以任意读取,而 fetch 却又不能读取,发生 KeyError 异常了呢?

1、内存不会有什么影响,指向是同一个对象。

2、 因为 [] 取不到值时会去取默认值, 而 fetch 会直接去取值,取不到就会抛异常。 没用 new(XX) 设置之前,默认值为 nil,所以也没啥想不通的。

  1. Hasn 的 [ ] 方法大体是这个流程:先从内部的 hash table 里查找 key 对应的 value。如果找不到则返回默认值。
  2. 在你的那个贴子里提到了,fetch 默认形式是在找不到 value 的情况下,会抛出异常。这个方法的行为就是如此。这个方法还有其他两种形式,可以不抛出异常。请参考 api 文档。

[ ] 和 fetch 是两个方法,行为是不一样的。不要混淆 :>

Hash#fetch 与 Hash#[] 是不同的方法,实现不同。

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