Incluír otros archivos
Cuando escribimos nuestros primeros programas en Ruby, solemos colocar todo el código
en un sólo archivo. Sin embargo, a medida que tenemos más experiencia y nuestros
programas crecen, nos damos cuenta que tener un sólo archivo no es suficiente.
Es más fácil dividir el código en grupos de manera lógica y colocar cada uno en uno
o más archivos separados. Cuando comenzamos a utilizar más de un archivo, necesitamos
utilizar los métodos require y load.
El método load incluye el archivo especificado cada vez que
es ejecutado:
1 load 'nombre_del_archivo.rb'
El método require (que es más comunmente utilizado) carga el archivo
especificado sólo una vez:
1 require 'nombre_del_archivo'
require te da acceso a las extensiones y librerías incluídas con Ruby
(la librería estándar) y a un número cada vez mayor de extensiones y librerías escritos
de manera independiente por otros programadores.
Toma nota de que decimos require 'nombre_del_archivo', no require
'nombre_del_archivo.rb' . Además de verse mejor, esta manera de referirnos a
la extensión es necesaria porque no todas las extesiones utilizan archivos terminados
en la extensión .rb. Específicamente, las extensiones escritas en C
son guardadads en archivos terminados en .so o .dll .
Para mantener el proceso transparente, es decir, para evitarnos el problema de saber
si la extensión que queremos utilizar utiliza una extensión .rb o
alguna otra, Ruby acepta que utilicemos sóle el nombre del archivo sin la extensión
y efectua una búsqueda automática de archivos hasta que encuentra la extensión que hemos
solicitado.
require(nombre) => true o fase1
Ruby trata de cargar la librería identificada con cierto nombre de archivo y regresa true
si tuvo éxito. Si el nombre del archivo no es una ruta absoluta, busca en los directorios
enlistados en la variable global $:. Si el archivo tiene la extensión .rb,
es cargado como archivo fuente (source); si la extensión es .so, .o, .dll o
cualquier extensión por defecto de la paltaforma en que se esté ejecutando el pragrama, Ruby carga
la librería como una extensión.
Rails utiliza el método load en lugar de require en el modo
development para recargar las clases cada vez que sea necesario (por ejemplo,
al recargar una página en el navegador.)
Veamos un ejemplo:
1 class Motocicleta 2 def initialize(marca, color) 3 # Variables de instancia 4 @marca = marca 5 @color = color 6 end 7 def arranca 8 if (@engineState) 9 puts 'Motor encendido' 10 else 11 @engineState = true 12 puts 'Motor apagado' 13 end 14 end 15 end
El programa p031pruebamotocicleta.rb utiliza la clase Motocicleta:
1 require 'p030motocicleta' 2 m = Motocicleta.new('Yamaha', 'rojo') 3 m.arranca 4 5 class Motocicleta 6 def describe 7 puts 'El color de la motocicleta es ' + @color 8 puts 'La marca de la motocicleta es ' + @marca 9 end 10 end 11 m.describe 12 m.arranca 13 puts self.class 14 puts self 15 puts Motocicleta.instance_methods(false).sort
1 Esto no es estrictamente cierto. Si el método require tiene éxito,
regresa true. Sin embargo, si no encuentra el archivo, no regresa false
sino genera una excepción LoadError.
La diferencia es significativa: Si el método reqire regresara false
cuando no encuentra una extensión o librería, el pragrama continuaría ejecutándose, en cuyo caso
se generaría una excepción más adelante (NoMethodError, o NameError por
ejemplo). Por el contrario, si Ruby no encuentra el archivo que queremos cargar con require
y genera una excepción, el programa deja de ejecutarse y sabemos inmediatamente cual es el problema.