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]