Contenidos

Esferas de visibilidad, como habitaciones en una casa

Cuando hablamos de variables mencionamos que el tipo de variables más común es la «variable local», sin explicar más por qué son locales. Local para qué? ¿En dónde? Por fin estamos listos para explicarlo más.

Ya que hemos hablado de métodos, también podemos discutir otro concepto importante: los ámbitos.

Wikipedia dice: «En programación, el alcance de un nombre es la parte de un programa donde el nombre es válido: donde el nombre se puede usar para referirse a algo.»(ligeramente modificado para que coincida con nuestra propia terminología) Los nombres

son conocidos (o definidos)en un cierto ámbito, y desconocidos (o indefinidos) fuera de este ámbito.

Puede pensar en un ámbito como una esfera, una burbuja o una habitación (con ventanas de ahora y puertas cerradas): Ciertos nombres, como los nombres de variables, son «conocidos» y»visibles» dentro de la habitación. Otros nombres, conocidos y visibles en otra habitación, no son conocidos en esta habitación, sino solo en la otra habitación.

Cada vez que hay una llamada a un método, y el flujo de ejecución entra en el cuerpo del método, entra en un nuevo ámbito, o»habitación». Las cosas que son» locales «al ámbito de este método (es decir, las cosas que están» dentro » de la habitación), solo son visibles en este ámbito. Fuera de él, son desconocidos.

Variable o método local indefinido

Esta también es una buena oportunidad para hablar sobre un mensaje de error que podría ver con mayor frecuencia. Por ejemplo, lo verás cada vez que hagas un error tipográfico y escribas mal el nombre de una variable o método.

Considere este código:

def add_two(number) number + 2endputs add_two(3)puts number

en La línea puts add_two(2) salida 5, pero la línea puts number willthen generar un error.

Esto se debe a que la variable number a la que se le asigna el número 3 cuando llamamos, el método es una variable local. Es local al alcance del método. Se crea cuando el flujo de ejecución entra en el método.

Fuera de este ámbito, cuando el flujo de ejecución ha regresado del método, el ámbito del método ha sido destruido y todas las variables locales han desaparecido. Por lo tanto, la variable local number no se conoce, y Ruby genera un error que diceundefined local variable or method 'number'.

Si piensa en este mensaje de error por un momento, ¿tiene sentido para usted?

Hemos omitido silenciosamente el hecho de que, en Ruby, tanto los nombres de variables locales como los nombres de métodos, se escriben de la misma manera: son solo palabras simples.Por ejemplo, aquí:

number = 2puts number
number es una variable local, y se utiliza en la línea puts number.

sin Embargo, aquí:

def number 2endputs number
number es el nombre de un método. Y se puede usar (llamar) en el mismo sentido exacto: puts number

Esto se debe a que Ruby, cuando ejecuta un programa, evalúa una instrucción después de otra. Y cuando se encuentra con una palabra simple como number, primero comprobará si, dentro del ámbito actual, conoce una variable local con el mismo nombre. Si es así, utilizará el valor que está asociado a esta variable. Si no hay ninguna variable local con este nombre, buscará un método. Si tampoco hay ningún método con este nombre, se mostrará el mensaje de errorundefined local variable or method 'number'.

Así que el mensaje de error es bastante preciso, pero también suena un poco complicado. Lo que básicamente intenta decir es:

Has usado la palabra «número» aquí, y no lo sé (en este ámbito). ¿Querías usar una variable local? O un método?

¿Tiene sentido?

de Vuelta al tema de los ámbitos locales. Veamos otro ejemplo:

number = 1def add_to(number) number + 2endputs add_to(3)

¿Cuál crees que será la salida? Será 3 o 5? Algo más?

Si ejecuta el código, verá que es 5.

La razón de esto es que asignamos el número 1 en el ámbito exterior a una variable number, pero esta variable nunca se usa: la única otra línea en el ámbito exterior es la última línea puts add_to(3), y esta línea no utiliza la variable

number

.

En su lugar, cuando el flujo de control ingresa al método add_toRuby creará un nuevo ámbito local, y definirá una nueva variable local numberque se asigna el número 3 que se pasó al método. Esta nueva variablenumber es local al ámbito del método, y por lo tanto es una variable diferente a la de la primera línea, en el ámbito externo.

Encontramos la siguiente metáfora para los alcances:

Cuando Ruby entra en un método, es como si entrara en una habitación nueva y brillante en una casa. Con ella, trae los objetos que se pasan como argumentos a themethod call. En el ejemplo anterior, trae un objeto que es el número 3.

Ahora, tan pronto como Ruby entra en el método, pega notas post-it en los objetos, de acuerdo con la lista de argumentos de la definición del método. En nuestro ejemplo, ese es el nombre number. Así que a partir de ahora, en esta sala, hay una variable local conocida que tiene un valor asignado: El objeto (número) 3 con la nota post-it number en él.

En nuestro ejemplo, el ámbito exterior y el ámbito del método add_two, son dos salas diferentes, y hay dos notas post-it diferentes pegadas en dos números diferentes, que simplemente tienen el mismo nombre en ellas.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.