irb(main)> foo = true unless defined?(Integer)
=> nil
irb(main)> foo = true unless defined?(thisIsUndefined)
=> true
Su primer bloque está volviendo nil
porque la forma en que está escrito hojas 2 opciones:
foo
no está definido -> asignar cierto
foo
se define -> hacer nada
Aquí, foo debe definirse cuando se evalúa la línea. Por lo tanto, no ocurre nada y se devuelve nil
.
irb(main)> unless defined?(Integer) ; fooo = false ; end
=> nil
irb(main)> unless defined?(thisIsUndefined) ; fooo = false ; end
=> false
Su segundo bloque funciona del mismo modo que su primer bloque. Si fooo
no está definido, se ingresa el bloque y fooo
se establece en false
. El resultado de la última línea del bloque es el valor de retorno del bloque, por lo tanto, está viendo el false
. Si fooo
existe, entonces el bloque se omite y no ocurre nada, por lo tanto, no hay nada que devolver, por lo tanto, el nil
.
De acuerdo con su código, yo diría que foo
se definió cuando se ejecutó este código y fooo
no (el código de prueba que se muestra se generó en Ruby 1.8.6). Si no definió ninguno de estos antes de ejecutar este código, entonces puede tener algo llamado foo
que está definido por defecto (haga defined?(foo)
por sí mismo para verificarlo). Intente usar un nombre diferente y vea si obtiene los mismos resultados.
Editar:
irb(main)> defined?(bar)
=> nil
irb(main)> bar = true unless defined?(bar)
=> nil
irb(main)> defined?(bar)
=> "local-variable"
Al parecer, defined?()
está volviendo cierto, puesto que ya ha visto bar
(al comienzo de la línea), a pesar de que todavía está en el proceso de definición de la misma.
¿Qué versión de Rubí está usando? – bta
Con todo esto de asignar variables a menos que ya estén definidas, me siento obligado a señalar que 'foo || = true' logra lo mismo (y siempre devuelve' true'). –
@Allison R. No si 'foo' está definido pero es falso. – FMc