【发布时间】:2013-10-26 01:24:54
【问题描述】:
从新开始的会话中考虑以下 irb sn-p:
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
【问题讨论】:
-
在您的任何示例中,您实际上都没有使用
||=,问题标题有点误导 -
更奇怪的是:
>> spam # => NameError; >> spam ||= "eggs" # => "eggs"; >> spam # => "eggs"。不一致。