考慮從一個新鮮開始會話以下IRB片段:||的奇怪含義和|| =在紅寶石(2.0,1.9.3,1.7.4的jruby)
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
你實際上並沒有在你的任何例子中使用'|| =',問題標題有點誤導 – nzifnab
更奇怪的是:'>> spam#=> NameError; >> spam || =「eggs」#=>「eggs」; >>垃圾郵件#=>「雞蛋」'。不一致。 – iamnotmaynard
可能的重複[混淆內部的謬誤\'if \'塊]賦值操作(http://stackoverflow.com/questions/15183576/confusion-with-the-assignment-operation-inside-the-fallacy-if -block) –