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]

Respuestas a la pregunta(3)

Su respuesta a la pregunta