Confusão com a operação de atribuição dentro de um bloco falso se `[duplicado]
Esta pergunta já tem uma resposta aqui:
Eu não entendo o escopo local do ruby 5 respostasEu estava brincando com a operação de atribuição dentro deif
blocks e descobriu o resultado abaixo, o que me surpreendeu:
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>'
No código acima, você pode ver que ox
variável local @ foi criada, mesmo que tenha sido atribuída apenas no diretório falsif
quadra. Tentei ver o conteúdo dex
comp x
o que me forçou a acreditar que a tarefa não foi concluída, mas ox
variável @ existe.x.object_id
também provou que é esse o caso.
Agora minha pergunta é como issox
variável local foi criada mesmo que oif
o ponto de entrada do bloco é fechado intencionalmente para sempre?
Eu esperava a saída dep x
seja semelhante à saída dep y
. Mas, em vez disso, recebi uma resposta surpreendente dep x
.
lguém poderia me explicar como esse conceito funcion
EDITA
Não, aqui está outro teste. Este não é o caso apenas comlocal
variáveis. O mesmo aconteceu cominstance
eclass
variáveis também. Veja abaixo:
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]
aso de sucesso:
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]