Confusión con la operación de asignación dentro de un bloque `if` falso [duplicado]
Esta pregunta ya tiene una respuesta aquí:
No entiendo el alcance local de ruby 5 respuestas Estaba jugando con la operación de asignación dentro deif
blocks, y descubrí el siguiente resultado, lo que me sorprendió:
C:\>irb --simple-prompt
if false
x = 10
end
#=> nil
p x
nil
x.object_id
#=> 4
#=> nil
p y
NameError: undefined local variable or method `y' for main:Object
from (irb):5
from C:/Ruby193/bin/irb:12:in `<main>'
En el código anterior puede ver que lax
La variable local se ha creado a pesar de que solo se asignó en la falsaif
bloque. Traté de ver el contenido dex
conp x
lo que me obligó a creer que la asignación no se realizó, pero lax
variable existe. @x.object_id
también demostró que ese es el caso.
Ahora mi pregunta es cómo esex
variable local se creó a pesar de queif
¿El punto de entrada del bloque está cerrado para siempre intencionalmente?
Esperaba la salida dep x
para ser similar a la salida dep y
. Pero en cambio recibí una respuesta sorprendente dep x
.
Podría alguien explicarme cómo funciona este concepto?
EDITA
No, aquí hay otra prueba. Este no es el caso con sololocal
variables. Lo mismo sucedió coninstance
yclass
variables también. Vea lo siguiente:
class Foo
def show
@X = 10 if false
p @X,"hi",@X.object_id
end
end
#=> nil
Foo.new.show
nil
"hi"
4
#=> [nil, "hi", 4]
class Foo
def self.show
@@X = 10 if false
p @@X,"hi",@@X.object_id
end
end
#=> nil
Foo.show
nil
"hi"
4
#=> [nil, "hi", 4]
Caso exitoso:
class Foo
def self.show
@@X = 10 if true
p @@X,"hi",@@X.object_id
end
end
#=> nil
Foo.show
10
"hi"
4
#=> [10, "hi", 4]