Rozważmy następujący fragment z IRB świeżo rozpoczął sesję:Dziwne znaczenie || i || = w Ruby (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
była niezdefiniowana zmienna i próbując ocenić wyprodukowany a NameError
. Jednak w jakiś sposób po tej operacji zdefiniowano baz
i ma ona wartość nil
. Pozornie wartość nil
została przypisana do zmiennej baz
, mimo że nikt (wyraźnie) nie prosił o jej podanie. Czy jest jakiś podstawowy powód, dla którego to zachowanie jest pożądane?
Jaka jest zasada, że wyjaśnia to zachowanie i innych podobnie mylące konstrukcje, takie jak te:
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
Nie używasz '|| =' w żadnym z przykładów, tytuł pytania jest nieco mylący. – nzifnab
Jeszcze dziwniej: '>> spam # => NameError; >> spam || = "jaja" # => "jaja"; >> spam # => "jaja" '. Niespójny. – iamnotmaynard
możliwy duplikat [Confusion z operacją przypisania wewnątrz błędu \ 'if \' block] (http://stackoverflow.com/questions/15183576/confusion-with-tassing-operation-inside-the -fallacy-if -block) –