Почему ключевое слово return вызывает проблемы в моем блоке if? - PullRequest
5 голосов
/ 15 мая 2009

Следующий код работает нормально:

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 внутри блока if, я получу ошибку:

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 может быть дополнительно использован везде, где уже есть предположение о возвращаемом значении.

1 Ответ

12 голосов
/ 15 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...