Si consideri il seguente frammento IRB da una sessione appena iniziato:Strano significato di || e || = in 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
era una variabile non definita e cercando di valutarla prodotto a NameError
. Tuttavia, in qualche modo, dopo questa operazione, è stato definito baz
e ha un valore di nil
. Apparentemente, il valore nil
è stato assegnato alla variabile baz
anche se nessuno (esplicitamente) ha chiesto che fosse. C'è un motivo di linguaggio di base per cui questo comportamento è desiderabile?
Qual è la regola che spiega questo comportamento e altri costrutti simile confusione, come questi:
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
In realtà non stai usando '|| =' in nessuno dei tuoi esempi, il titolo della domanda è un po 'ingannevole – nzifnab
Ancora più strano: '>> spam # => NameError; >> spam || = "uova" # => "uova"; >> spam # => "uova" '. Incoerente. – iamnotmaynard
possibile duplicato di [Confusione con l'operazione di assegnazione all'interno della fallacia \ 'se \" blocco] (http://stackoverflow.com/questions/15183576/confusion-with-the-assignment-operation-inside-the-fallacy-if -block) –