2009-01-23 18 views
11

Şu anda örneğin gerektiren komutunu kullanarak her sınıf dosyası içine Yakut sınıfları yükleme ediyorum: Her sınıf içinRuby sınıflarını bir uygulamaya yüklemenin en iyi yolu nedir?

require File.join(File.dirname(__FILE__), 'observation_worker') 
require File.join(File.dirname(__FILE__), 'log_worker') 

Ben gerektirir sınıfları tanımlama. Bunu başvurumun giriş noktasında yapabilirsem harika olurdu.

Tüm Ruby sınıflarını uygulamanın başlangıcında yüklemek için kolay bir yol var mı? Hep ihtiyacı hangi dosyaların programınızı anlatmak zorunda olacağından

cevap

11

gerektirebilir böylece:

require 'observation_worker' 
require 'logger_worker' 

veya lib içindeki klasörler varsa bile yapabilirdi

require 'workers/observation' 
require 'workers/logger' 

Bu, bir kütüphane bağlamında yükleme işleminin bence bana göre en temiz yoludur.

2

emin değilim tam olarak anlamak, ancak böyle bir şey yapabileceğini: dizinindeki tüm .rb dosyaları içerir

Dir["#{File.dirname(__FILE__)}/*.rb"].each { |f| require(f) } 

geçerli dosya. Her ne kadar RDoc kullanmaya başlarsanız, sizinle mutlu olmayacaktır.

Genel olarak açık bir şekilde listelemenizi listelemek kötü bir şey değildir, diğer geliştiricilerin kodunuzu okumaya başladığını açıkça gösterir. jtzero tarafından yorumladı

1

gibi, özdevinimli_yükle Hala yüklemek ne belirtmeniz gerekir


kullanımdan kaldırıldı, ancak autoload deneyebilirsiniz. Sabit Module ilk require otomatik olarak d olacak bir dosya "module" kullanılır

autoload :Module, "module" 

. Eğer kod

$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib')) 

gibi yük yoluna özgü dizin yolları olabilir gittiği yerlerin biraz açık dizin yapısını varsa o zaman kodun diğer bölümlerinde sen gibi göreceli bir yoldan

+1

başvuru, autoload için [kullanım dışı] (https://www.ruby-forum.com/topic/3036681) – jtzero

2

Kullanmaktan hoşlandığım bir seçenek. github doc

require 'autocode' 

    module Application 
    include AutoCode 
    auto_load true, :directories => [ :configurations, :models, :views, :controllers ] 
    end 

Bu içinde. Böylece, uygulama bakmak için hangi dizin belirlemek için modül adını kullanarak, verilen dizinleri dinamik kod yüklemeye çalışacaktır itibaren

http://github.com/dyoder/autocode/tree/master

:: CustomerModel, dosya modellerini/customer_model.rb dosyasını yükleyebilir.

Ayrıca, rayların çizme yollarını da kontrol edebilirsiniz.

+1

referans [autocode] için (http://github.com/dyoder/autocode/tree/master) "Bu havuz kullanımda daha uzun süre kısaca kaldırılacak. Lütfen dalgaları/otomatik kod deposunu kullanın. " – jtzero

1

çıkış

http://github.com/alexeypetrushin/class_loader

Eğer

/your_app 
    /lib    
     /animals 
      /dog.rb 
     /zoo.rb 

sadece nokta ClassLoader senin App köküne aşağıdaki dizin yapısına sahip diyelim ki bu sınıf yükleyici, bulmak ve yükler tüm diğer sınıflar otomatik olacak

require 'class_loader' 
autoload_dir '/your_app/lib' 

Zoo.add Animals::Dog.new # <= all classes loaded automatically 
İlgili konular