¿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.