Путаница с операцией присваивания внутри ложного блока if [duplicate]

На этот вопрос уже есть ответ:

Я не понимаю рубиновую локальную сферу 5 ответов

Я играл с операцией присваивания внутриif блокирует и обнаружил приведенный ниже результат, который меня удивил:

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>'

В приведенном выше коде видно, чx локальная переменная была создана, хотя она была назначена только в ложномif блок. Я пытался увидеть содержаниеx сp x что заставило меня поверить, что задание не было сделано, ноx переменная существует.x.object_id также доказал, что это так.

Теперь мой вопрос, как этоx локальная переменная была создана, хотяif блок входа закрывается навсегда намеренно?

Я ожидал выходаp x быть похожим на вывод изp y. Но вместо этого я получил неожиданный ответ отp x.

Может кто-нибудь объяснить мне, как работает эта концепция?

РЕДАКТИРОВАТ

Нет, вот еще один тест. Это не касается толькоlocal переменные. То же самое произошло сinstance а такжеclass переменные тоже. Смотрите ниже:

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]

Успешный случай:

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]

Ответы на вопрос(3)

Ваш ответ на вопрос