考虑一下新开始的会话中的以下 irb 片段:
irb:01> baz # => NameError, baz is not defined
irb:02> baz || baz = 0 # => NameError, baz is not defined
irb:03> baz # => nil
baz
是一个未定义的变量,并试图评估它产生了一个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