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.