2011-05-13 21 views
19

loadee.rbcarga trabaja en ruta local, no requiere

puts '> This is the second file.' 

loaddemo.rb

puts 'This is the first (master) program file.' 
load 'loadee.rb' 
puts 'And back again to the first file.' 

Cuando corro "ruby loaddemo.rb", Esto funciona bien. Ambos archivos están en el mismo directorio, y ese es el directorio desde el que corro.

Pero si cambio de la carga a una requieran, y con o sin la extensión me sale:

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load 
-- loadee.rb (LoadError) 
     from <internal:lib/rubygems/custom_require>:29:in `require' 
     from loaddemo.rb:2:in `<main>' 

Mi pregunta es, por supuesto, ¿por qué no se requerirá trabajar en este caso? Debería, ¿verdad? ¿Carga y requiere usar diferentes caminos?

versión de Ruby 1.9.2

Respuesta

38

Si proporciona sólo un nombre de archivo para require, sólo se verá en los directorios predefinidos $LOAD_PATH. Sin embargo, si se proporciona un camino con su nombre de fichero, que debería funcionar:

puts 'This is the first (master) program file.' 
require './loadee.rb' 
puts 'And back again to the first file.' 

También puede añadir la carpeta de su proyecto a la trayectoria de la carga en su lugar:

$LOAD_PATH.unshift File.dirname(__FILE__) 
puts 'This is the first (master) program file.' 
require 'loadee.rb' 
puts 'And back again to the first file.' 

Y por último, es posible que utilices require_relative en su lugar:

puts 'This is the first (master) program file.' 
require_relative 'loadee.rb' 
puts 'And back again to the first file.' 
+2

Entonces, ¿por qué la carga funciona sin la ruta? ¿Utiliza una variable de ruta diferente? –

+1

Esto realmente está listado como un error para ruby ​​en este momento. 1.9 eliminó el "directorio actual" de la ruta de carga al usar 'require', pero no para' load'. http://redmine.ruby-lang.org/issues/2710 –

+2

Además, tenga en cuenta que cada vez que usa 'load', evalúa el archivo completo, mientras que' require 'solo evalúa el archivo la primera vez que necesita eso. –

4

Proporcionar un camino con el nombre del archivo no parecía funcionar para mí, y yo no quería meter un montón de caminos en mi $LOAD_PATH.

Revisando el documentation, encontré require_relative.

require_relative 'loadee' 

Obras en tanto 1.9.2 y 2.1.2.

El documentation indica que require no tiene como objetivo buscar rutas relativas en absoluto, y tampoco es load.