2009-05-15 5 views
5

Le code suivant fonctionne très bien:Pourquoi le mot-clé return provoque-t-il des problèmes dans mon 'if block'?

person = {:a=>:A, :b=>:B, :c=>:C} 
berson = {:a=>:A1, :b=>:B1, :c=>:C1} 

kerson = person.merge(berson) do | key, oldv, newv | 
if key == :a 
    oldv 
elsif key == :b 
    newv 
else 
    key 
end 
end 

puts kerson.inspect 

mais si j'ajoute return à l'intérieur du "si le bloc", je reçois une erreur:

person = {:a=>:A, :b=>:B, :c=>:C} 
berson = {:a=>:A1, :b=>:B1, :c=>:C1} 

kerson = person.merge(berson) do | key, oldv, newv | 
if key == :a 
    return oldv 
elsif key == :b 
    return newv 
else 
    return key 
end 
end 

puts kerson.inspect 

L'erreur du code ci-dessus est:

unexpected return (LocalJumpError) 

Quelqu'un peut-il expliquer cela? Je pensais que return pourrait être utilisé en option là où il y a déjà l'hypothèse d'une valeur retournée.

Répondre

12

La raison de l'erreur est que les blocs n'ont pas vraiment leur propre portée à partir de laquelle ils reviennent - un retour d'un bloc est équivalent au retour de la méthode environnante. Quelle est la méthode environnante ici? Il n'y en a pas - c'est au niveau supérieur, donc c'est équivalent à ruby -e "return", ce qui vous donnera la même erreur. Si vous collez ceci dans une méthode, la méthode retournera la valeur de la première branche de la clause if qui sera exécutée.

Questions connexes