Variables globales en Ruby

Las variables globales son variables a las que se puede acceder desde cualquier lugar del programa, independientemente del alcance. Se denotan comenzando con un carácter $ (signo de dólar). Sin embargo, el uso de variables globales a menudo se considera "no Ruby", y rara vez las verá..

Definición de variables globales

Las variables globales se definen y usan como cualquier otra variable. Para definirlos, simplemente asígneles un valor y comience a usarlos. Pero, como su nombre lo indica, la asignación a variables globales desde cualquier punto del programa tiene implicaciones globales. El siguiente programa demuestra esto. El método modificará una variable global, y eso afectará la forma en que segundo el método corre.

 $ speed = 10 def accelerate $ speed = 100 end def pass_speed_trap si $ speed> 65 # Dele al programa un boleto de exceso de velocidad end end acelerate pass_speed_trap 

Impopular

Entonces, ¿por qué es esto "un-Ruby" y por qué no ves variables globales con mucha frecuencia? En pocas palabras, rompe la encapsulación. Si alguna clase o método puede modificar el estado de las variables globales a voluntad sin una capa de interfaz, cualquier otra clase o método que dependa de esa variable global puede comportarse de manera inesperada e indeseable. Además, tales interacciones pueden ser muy difíciles de depurar. ¿Qué modificó esa variable global y cuándo? Buscará un montón de código para encontrar qué lo hizo, y eso podría haberse evitado al no romper las reglas de encapsulación.

Pero eso no quiere decir que las variables globales sean Nunca Utilizado en Ruby. Hay una serie de variables globales especiales con nombres de un solo carácter (a-la Perl) que se pueden usar en todo el programa. Representan el estado del programa en sí y hacen cosas como modificar el registro y los separadores de campo para todos consigue métodos.

Variables globales

  • $ 0 - Esta variable, denotada por $ 0 (que es un cero), contiene el nombre del script de nivel superior que se está ejecutando. En otras palabras, el archivo de script que se ejecutó desde la línea de comandos, no el archivo de script que contiene el código que se está ejecutando actualmente. Así que si script1.rb se ejecutó desde la línea de comando, aguantaría script1.rb. Si este script requiere script2.rb, $ 0 en ese archivo de script también sería script1.rb. El nombre $ 0 refleja la convención de nomenclatura utilizada en las secuencias de comandos de shell de UNIX con el mismo propósito.
  • PS - Los argumentos de la línea de comandos en una matriz denotada por $ * (signo de dólar y asterisco). Por ejemplo, si tuvieras que correr ./script.rb arg1 arg2, entonces $ * sería equivalente a % w arg1 arg2. Esto es equivalente a la matriz especial ARGV y tiene un nombre menos descriptivo, por lo que rara vez se usa.
  • $$ - La identificación del proceso del intérprete, denotada por $$ (dos signos de dólar). Conocer la propia ID de proceso a menudo es útil en programas daemon (que se ejecutan en segundo plano, sin conexión desde cualquier terminal) o servicios del sistema. Sin embargo, esto se vuelve un poco más complicado cuando hay hilos involucrados, así que tenga cuidado de usarlo a ciegas.
  • $ / y $ \ - Estos son los separadores de registros de entrada y salida. Cuando lees objetos usando consigue e imprimirlos usando pone, los utiliza para saber cuándo se ha leído un "registro" completo o qué imprimir entre varios registros. Por defecto, estos deberían ser el carácter de nueva línea. Pero dado que estos afectan el comportamiento de todos los objetos IO, rara vez se usan, si es que lo hacen. Puede verlos en scripts más pequeños donde romper las reglas de encapsulación no es un problema.
  • PS? - El estado de salida del último proceso secundario ejecutado. De todas las variables enumeradas aquí, esta es probablemente la más útil. La razón de esto es simple: no puede obtener el estado de salida de los procesos secundarios por su valor de retorno del método del sistema, solo verdadero o falso. Si debe conocer el valor de retorno real del proceso secundario, debe usar esta variable global especial. Nuevamente, el nombre de esta variable se toma de los shells de UNIX.
  • PS - La última cadena leída por consigue. Esta variable puede ser un punto de confusión para aquellos que vienen a Ruby desde Perl. En Perl, la variable $ _ significa algo similar, pero totalmente diferente. En perl, PS contiene el valor de la última declaración y en Ruby contiene la cadena devuelta por el anterior consigue invocación. Su uso es similar, pero lo que realmente tienen es muy diferente. Tampoco suele ver esta variable (ahora que lo pienso, rara vez ve alguna de estas variables), pero puede verla en programas Ruby muy cortos que procesan texto.

En resumen, rara vez verá variables globales. A menudo son de mala forma (y "no-Ruby") y solo realmente útiles en scripts muy pequeños, donde se puede apreciar completamente la implicación completa de su uso. Hay algunas variables globales especiales que se pueden usar, pero en su mayor parte, no se usan. Realmente no necesita saber mucho sobre variables globales para comprender la mayoría de los programas de Ruby, pero al menos debe saber que están ahí.