Hash.fetch(not_exist_key)引发IndexError而不是KeyError

时间:2013-07-21 15:02:59

标签: ruby exception doc

在文档中,它说:

  

fetch(key [,default])→obj; fetch(key){|关键|阻止}→obj

     

从给定键的哈希值返回一个值。如果找不到密钥,有几个选项:没有其他参数,它会引发 KeyError 异常;如果给出了默认值,那么将返回;如果指定了可选代码块,那么将运行该代码块并返回其结果。

在我的航站楼,irb说:

irb(main):001:0> hash = { 1 => "No one", 2 => "gonna", 3 => "fetch me" }
=> {1=>"No one", 2=>"gonna", 3=>"fetch me"}

irb(main):002:0> hash.fetch(4)
IndexError: key not found
    from (irb):2:in `fetch'
    from (irb):2
    from :0

你能帮我解释一下吗?

2 个答案:

答案 0 :(得分:5)

好像你正在使用旧版本的Ruby。根据{{​​3}},它会引发IndexError

  

从给定键的哈希值返回一个值。如果钥匙不能   发现,有几种选择:没有其他参数,它会   引发 IndexError 异常;如果给出了默认值,那么就是   回;如果指定了可选代码块,那么就是   运行并返回其结果。

请注意1.8.7 docs是Ruby 1.9+中KeyError的子类,因此抢救IndexError也有效。

答案 1 :(得分:1)

我正在使用ruby 1.9.3p0并且没有问题:

irb(main):001:0> hash = { 1 => "No one", 2 => "gonna", 3 => "fetch me" }
    => {1=>"No one", 2=>"gonna", 3=>"fetch me"}

irb(main):002:0> hash.fetch(4) 

KeyError: key not found: 4
    from (irb):2:in `fetch'
    from (irb):2
    from /home/marek/.rbenv/versions/1.9.3-p0/bin/irb:12:in `<main>'

irb(main):003:0> hash.fetch(1) 
=> "No one"