2013-07-21 1 views
2

Dans la documentation, il est dit:Hash.fetch (not_exist_key) soulève IndexError au lieu de KeyError

fetch (touche [, par défaut]) → obj; aller chercher (clé) {| clé | block} → obj

Renvoie une valeur du hachage pour la clé donnée. Si la clé ne peut pas être trouvée, il y a plusieurs options: Sans aucun autre argument, elle déclenchera une exception KeyError; si la valeur par défaut est donnée, alors cela sera retourné; Si le bloc de code optionnel est spécifié, alors celui-ci sera exécuté et son résultat retourné.

Dans mon terminal, dit 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 

Pouvez-vous me aider à expliquer cela?

+1

quelle version de rubis que vous utilisez? pour moi c'est OK .. –

+0

ruby ​​1.9.1 et irb 0.9.5. Oui je sais mais c'est juste un peu de curiosité. Les docs sont différents de la réalité. –

Répondre

5

On dirait que vous utilisez une ancienne version de Ruby. Selon le 1.8.7 docs il soulève une IndexError:

Renvoie une valeur de hachage pour la clé donnée. Si la clé ne peut pas être trouvée, il existe plusieurs options: Sans aucun autre argument, déclenchera une exception IndexError; Si la valeur par défaut est donnée, alors ce sera retourné; Si le bloc de code facultatif est spécifié, ce sera et son résultat sera renvoyé.

Notez que KeyError est une sous-classe de IndexError en Ruby 1.9+, donc sauver IndexError œuvres, aussi.

+1

oh, je réalise qu'il existe 2 version de ruby ​​dans mon ordinateur. Peut-être que j'utilise la version 1.8. Comment puis-je passer à ruby1.9? –

+1

J'utilise [chruby] (https://github.com/postmodern/chruby) pour changer les versions de Ruby, mais [rbenv] (https://github.com/sstephenson/rbenv) et [RVM] (https: //rvm.io) sont aussi populaires. – Stefan

1

J'utilise 1.9.3p0 rubis et ai aucun problème:

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" 
+0

quelle est votre version d'irb? –

+0

irb 0.9.6 (09/06/30) –

+0

merci. Je comprends que mon irb pointe vers le répertoire ruby1.8. je vais changer ça –