¿Por qué la siguiente expresión en Ruby no da ningún error
irb(main):001:0> puts x=1 if x.nil?
1
=> nil
... mientras que la siguiente falla estrepitosamente?
irb(main):001:0> puts "z is not defined" if z.nil?
NameError: undefined local variable or method `z' for main:Object
from (irb):1
la diferencia ocurre en el análisis sintáctico que realiza el intérprete, que cuando se encuentra
con un identificador (en nuestro caso, x y z) debe determinar si se trata de un
objeto o bien de una invocación de un método definido en el ámbito de la clase o módulo actual
(z.nil podría referirse a un método z que devuelve un objeto del que
comprobamos si es nulo o no)
En el primer ejemplo, el intérprete de Ruby ve que hacemos referencia a una variable x en la
expresión x=1 de manera que asume que x es un objeto, al que se le puede invocar el
método x.nil?
En el segundo caso no es así: la referencia a z ocurre dentro de una cadena -donde el intérprete no husmea en busca
de información sintáctica-, de manera que cuando llegamos a if z.nil? Ruby asume que se trata de una
función o un método definido en el ámbito actual. Al no encontrarlos, devuelve el mensaje de error que,
una vez considerado lo anterior, resulta ser bastante descriptivo.
Podemos comprobar que este proceso ocurre en el análisis sintáctico del fichero (en lugar de en tiempo de ejecución del código) con el siguiente código:
irb(main):001:0> x.class
NameError: undefined local variable or method `x' for main:Object
from (irb):1
irb(main):002:0> if false
irb(main):003:1> x=0
irb(main):004:1> end
=> nil
irb(main):005:0> x.class
=> NilClass
La línea x=0 jamás se ejecuta, pero sí que es tenida en cuenta a la hora de determinar
que x debe tratarse como un objeto en lugar de como una invocación de método.


Sorry, comments are closed for this article.