2009-05-15 3 views
5

Следующий код работает отлично:Почему ключевое слово return вызывает проблемы в моем «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 

, но если добавить return внутри «если блок», я получаю сообщение об ошибке:

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 

Ошибка из приведенного выше кода является:

unexpected return (LocalJumpError) 

Может ли это объяснить это? Я думал, что return может быть необязательно использован везде, где уже есть предположение о возвращаемом значении.

ответ

12

Причина ошибки заключается в том, что блоки не имеют собственной области видимости, из которой они возвращаются - возврат из блока эквивалентен возврату из окружающего метода. Каков окружающий метод здесь? Нет ни одного - он находится на верхнем уровне, поэтому это эквивалентно выполнению ruby -e "return", что даст вам ту же ошибку. Если вы придерживаетесь этого метода, он заставит метод вернуть значение первой ветви if-предложения, которое будет выполнено.

Смежные вопросы