Konfuzja z operacją przypisania w bloku falsy `if` [duplikat]

To pytanie ma już odpowiedź tutaj:

Nie rozumiem lokalnego zasięgu ruby 5 odpowiedzi

Bawiłem się operacją przypisania w obrębieif blokuje i odkryłem poniższy wynik, który mnie zaskoczył:

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

W powyższym kodzie widać, żex zmienna lokalna została utworzona, mimo że została przypisana tylko w falsyif blok. Próbowałem zobaczyć zawartośćx zp x co zmusiło mnie do przekonania, że zadanie nie zostało wykonane, alex zmienna istnieje.x.object_id również udowodnił, że tak jest.

Teraz moje pytanie brzmi: jak tox zmienna lokalna została utworzona, mimo żeif punkt wejścia bloku jest celowo zamknięty na zawsze?

Spodziewałem się wynikup x ma być podobny do wyjścia zp y. Zamiast tego otrzymałem zaskakującą odpowiedź odp x.

Czy ktoś mógłby mi wyjaśnić, jak działa ta koncepcja?

EDYTOWA

Nie, oto kolejny test. Nie dotyczy to tylkolocal zmienne. To samo stało się zinstance iclass zmienne również. Zobacz poniżej:

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]

Udany przypadek:

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]

questionAnswers(3)

yourAnswerToTheQuestion