Рассмотрим следующий фрагмент irb из недавно запущенного сеанса:
irb:01> baz # => NameError, baz is not defined
irb:02> baz || baz = 0 # => NameError, baz is not defined
irb:03> baz # => nil
baz
была переменной undefined, и, пытаясь ее оценить, она произвела a NameError
. Однако каким-то образом после этой операции был определен baz
и имеет значение nil
. По-видимому, значение nil
было присвоено переменной baz
, хотя никто (явно) не просил ее об этом. Существует ли основной язык, почему это поведение желательно?
Каково правило, объясняющее это поведение и другие аналогично запутывающие конструкции, такие как:
irb:04> true if foo # => NameError
irb:05> foo # => NameError; name still undefined
irb:06> foo = (true if foo) # => nil
irb:07> foo # => nil; name defined as nil
irb:08> true || i = 0 || j = 2 # => i and j are nil; || appears nonlazy
irb:09> raise || quux = 1 # => RuntimeError, quux is nil