2010-10-29 14 views
8

local variable¿Por qué no podemos acceder a la variable local dentro del rescate?

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 

Instancia variable

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

El primero funciona para mí, si le asigno a la variable dentro o fuera del 'comenzar ... rescue' bloquear. –

+0

@Antal Estoy utilizando la transacción dentro de begin block y he definido el objeto dentro de la transacción. ¿Puede causar el problema? He actualizado mi pregunta. –

+0

¿Qué tan local quiere decir? – xtofl

Respuesta

27

Usted seguramente puede acceder a las variables locales definidas en un begin, en el rescue bloques correspondiente (asumiendo por supuesto, la excepción se ha planteado, después de la variable fue establecida).

Lo que no puede hacer es acceder a las variables locales que se definen dentro de un bloque, fuera del bloque. Esto no tiene nada que ver con excepciones. Ver este sencillo ejemplo:

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

Lo que puede hacer para solucionar este problema, es definir la variable antes de que el bloque (que sólo puede ponerlo a cero) y luego ponerlo en el interior del bloque.

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

Así que si cambia de código como este, que funcionará:

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

Tengo la actualización de mi pregunta. ¿Puedes ayudarme con eso? –

+0

@krunal: Actualicé mi respuesta. – sepp2k

Cuestiones relacionadas