Путаница с операцией присваивания внутри ложного блока 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]