a
Aquí, usted está evaluando a
, que no está definido. Por lo tanto, obtienes una excepción.
a || 1
Aquí, todavía tiene que evaluar a
para determinar el valor de la expresión booleana. Al igual que arriba, a
no está definido. Por lo tanto, obtienes una excepción.
a = a || 1
Aquí, a
es definido. Se define como una variable local no inicializada. En Ruby, las variables no inicializadas evalúan a nil
, por lo que el lado derecho de la expresión de asignación evalúa a nil || 1
, por lo que el valor de retorno de la expresión de asignación es 1
y el efecto secundario es a
que se inicializa en 1
.
EDITAR: Parece que hay cierta confusión sobre cuándo se definen las variables y cuándo se inicializan en Ruby. El get se definió en parse time pero se inicializó en runtime. Se puede ver aquí:
foo # => NameError: undefined local variable or method `foo' for main:Object
foo
no está definido.
if false
foo = 'This will never get executed'
end
En este punto, foo
se define, a pesar de que la línea nunca se ejecutan. El hecho de que la línea nunca se ejecute es completamente irrelevante, porque el intérprete no tiene nada que ver con esto de todos modos: las variables locales son definidas por el analizador, y el analizador obviamente ve esta línea.
foo # => nil
no hay error, porque foo
se define y se evalúa como nil
porque es inicializado.
Duplicado de http://stackoverflow.com/questions/1462407/ruby-edge-cases –