Hash.fetch(not_exist_key) вызывает IndexError вместо KeyError

В документах написано:

выборка (клавиша [, по умолчанию]) → объект; выборка (ключ) {| ключ | блок } → объект

Возвращает значение из хэша для данного ключа. Если ключ не может быть найден, есть несколько вариантов: без других аргументов будет возбуждено исключение 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

Можете ли вы помочь мне объяснить это?


person Hieu Nguyen    schedule 21.07.2013    source источник
comment
какую версию рубина вы используете? для меня это нормально..   -  person Arup Rakshit    schedule 21.07.2013
comment
рубин 1.9.1 и ирб 0.9.5. Да, я знаю, но это просто небольшое любопытство. Документы отличаются от реальности.   -  person Hieu Nguyen    schedule 21.07.2013


Ответы (2)


Похоже, вы используете более старую версию Ruby. Согласно 1.8.7 он вызывает IndexError:

Возвращает значение из хэша для данного ключа. Если ключ не может быть найден, есть несколько вариантов: без других аргументов будет вызвано исключение IndexError; если задано значение по умолчанию, то оно будет возвращено; если указан необязательный блок кода, то он будет запущен и его результат будет возвращен.

Обратите внимание, что KeyError является подклассом IndexError в Ruby 1.9+, поэтому спасение IndexError тоже работает.

person Stefan    schedule 21.07.2013
comment
о, я понимаю, что на моем компьютере существует 2 версии ruby. Возможно, я использую версию 1.8. Как мне переключиться на ruby1.9? - person Hieu Nguyen; 21.07.2013
comment
Я использую chruby для переключения версий Ruby, но rbenv и RVM также популярны. - person Stefan; 21.07.2013

Я использую 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"
person Community    schedule 21.07.2013
comment
какая у тебя версия irb? - person Hieu Nguyen; 21.07.2013
comment
Благодарю. Я понимаю, что мой irb указывает на каталог ruby1.8. я изменю это - person Hieu Nguyen; 21.07.2013