Esto tiene que ver con un capricho de las reglas de alcance de Ruby.
En ruby, una variable sin decorar x
que aparece por sí sola podría ser una variable local o una llamada a un método: la gramática no puede decir cuál. Depende del analizador el descifrarlo ya que resuelve las referencias de variables locales. La regla es simple: si ya se ha visto una asignación a una variable del mismo nombre en el ámbito local, entonces la referencia es una variable local y la referencia está vinculada a esa variable local. De lo contrario, es una llamada a método, y se buscará como tal en tiempo de ejecución.
Las referencias de variables locales en Ruby se optimizan en búsquedas de arreglos (a cada variable local se le asigna un 'intervalo', y las referencias de variables locales encuadernadas generadas por el analizador se convierten en referencias de intervalos). La matriz se inicializa con toda nil
:
/* initialize local variables */
for (i=0; i < local_size; i++) {
*sp++ = Qnil;
}
Por lo tanto, si se hace referencia a una variable local que no ha sido asignado, a través de una cota de referencia local (que sólo puede suceder si había una asignación saltado por encima de la referencia en el mismo alcance local), obtiene nil
.
Ah, sígueme. Buena explicación. – nneonneo