2011-05-13 18 views
19

xxxxxx xzxx yükleme yerel yol üzerinde çalışır, gerektirmez

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

"ruby loaddemo.rb" çalıştırdığımda, bu iyi çalışıyor. Her iki dosya da aynı dizinde ve benim çalıştığım dizin.

Ancak yükü bir gereksinim olarak değiştirirsem ve uzantı olsun ya da olmasın:

<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>' 

Benim sorum şu ki, neden bu durumda çalışmak gerekmiyor? Olmalı, değil mi? Yükleme yapmak ve farklı yollar kullanmak mı gerekiyor?

Ruby sürümü 1.9.2

cevap

38

sen require için sadece bir dosya adı sağlarsanız

Yakut sürümü, sadece önceden tanımlanmış $LOAD_PATH dizine de bakacaktır. Eğer dosya adıyla bir yol sağlamak Ancak, bu çalışması gerekir:

$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.' 

Ve son, sadece require_relative kullanabilirsiniz:

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

Ayrıca yerine yük yoluna projenizin klasör eklemek olabilir yerine: dosya adı benim için çalışmak değil gibiydi ile

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

Öyleyse yol neden yolsuz çalışıyor? Farklı bir yol değişkeni kullanıyor mu? –

+1

Bu aslında şu anda ruby ​​için bir hata olarak listelenir. 1.9, 'require' kullanırken 'load' için değil," geçerli dizini "yük yolundan kaldırıldı. http://redmine.ruby-lang.org/issues/2710 –

+2

Ayrıca, 'load' işlevini kullandığınızda, dosyanın tamamını değerlendirdiğinden, 'require' işlevini kullanmak, dosyayı yalnızca ilk kez istediğiniz zaman değerlendirir. o. –

4

bir yol sağlanması ve benim $LOAD_PATH içine yolları bir demet tıkmak istemiyordu.

documentation'u kontrol ederek, require_relative numaralı telefonu buldum. 1.9.2 ve 2.1.2 hem

require_relative 'loadee' 

eserler.

documentation, require öğesinin göreli yolları aramayı amaçlamadığını ve load'un ne olduğunu belirtmez.

İlgili konular