Почему мы не можем получить доступ к локальной переменной внутри спасения? - PullRequest
9 голосов
/ 29 октября 2010

Локальная переменная

begin
  transaction  #Code inside transaction 
    object = Class.new attributes
    raise unless object.save!
  end 
rescue
  puts object.error.full_messages # Why can't we use local varible inside rescue ?
end

Переменная экземпляра

begin
  transaction  #Code inside transaction 
    @object = Class.new attributes
    raise unless @object.save!
  end 
rescue
  puts @object.error.full_messages # This is working fine.
end

1 Ответ

28 голосов
/ 29 октября 2010

Скорее всего, вы можете получить доступ к локальным переменным, определенным в begin, в соответствующем блоке rescue (если, конечно, исключение было вызвано после того, как переменная была установлена).

Что выне может получить доступ к локальным переменным, которые определены внутри блока, вне блока.Это не имеет ничего общего с исключениями.Посмотрите на этот простой пример:

define transaction() yield end
transaction do
  x = 42
end
puts x # This will cause an error because `x` is not defined here.

Что вы можете сделать, чтобы исправить это, это определить переменную перед блоком (вы можете просто установить ее на ноль), а затем установить ее внутри блока.

x = nil
transaction do
  x = 42
end
puts x # Will print 42

Так что если вы измените свой код следующим образом, он будет работать:

begin
  object = nil
  transaction do  #Code inside transaction 
    object = Class.new attributes
    raise unless object.save!
  end 
rescue
  puts object.error.full_messages # Why can't we use local varible inside rescue ?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...