2011-10-22 6 views
6

To jest trochę mikro pytanie, ale za każdym razem, gdy tworzę klejnot i trzeba załadować wszystkie pliki w podkatalogu dla jakiegoś celu odblaskowego (lub po prostu szybkie i brudne wstępne obciążenie), zadaję sobie pytanie " na pewno nie musi być bardziej przejrzysty sposób „, w odniesieniu do tego wspólnego wzoru:Krótsza wersja katalogu Dir [File.join (nazwa pliku.display (__ FILE__), "podkatalog/**/*. Rb")]?

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

konieczności wywoływania File.dirname na __FILE__ sprawia, że ​​niepotrzebnie gadatliwy. Nie można tak naprawdę użyć względnej ścieżki wewnątrz klejnotu, ponieważ nie masz pojęcia, skąd jesteś ładowany.

+2

interpolować nazwę katalogu zamiast wywoływać 'File.join' – cam

+0

Heh, chyba to działa :) File.join robi pewne rzeczy dla Windowsa , ale biorąc pod uwagę, że ruby ​​załaduje pliki używając '/' niezależnie od tego, tak naprawdę nie ma to znaczenia. – d11wtq

+0

Zobacz także http://stackoverflow.com/questions/788550/is-there-a-shorter-way-to-require-a-file-in-tame-firma-in-ruby i http: // stackoverflow .pl/questions/735073/best-way-to-require-all-files-from-a-directory-in-ruby – knut

Odpowiedz

1

Z jakiego rube korzystasz? Ruby 1.9 umożliwia korzystanie z require_relative.

require_relative 'subdirectory/file1.rb' 
require_relative 'subdirectory/file2.rb' 
#... 

Ale musisz znać pliki. require_relative nie będzie działać z wszystkimi plikami w podkatalogu. Ale nie poleciłbym używać tak typowego odczytu w klejnocie. Powinieneś wiedzieć, co ładujesz.

Jeśli naprawdę chcesz, możesz użyć czegoś takiego:

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

z Ruby 1.8 to powinno działać:

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

chodzi File.join robi kilka rzeczy na Windows: File.join buduje ścieżkę, aby system operacyjny mógł z niej korzystać. W systemie UNIX separatorem ścieżek jest /, w systemie Windows \. Ale jak już napisałeś: ruby ​​rozumie /, więc nie ma to znaczenia w oknach. Ale co się stanie, jeśli będziesz pracować z klasycznym Mac OS? Tam jest : (patrz Wikipedia Path_(computing)). Więc lepiej jest użyć join, (lub użyć mojego wariantu Dir.chdir)

+0

Świetna odpowiedź. Nie wiedziałem o require_relative, dzięki! Używam ruby ​​1.9 i tbh, nie troszczę się o obsługę 1.8 w klejnotach, które piszę ... Myślę, że wspieranie starszych wersji języków tylko spowalnia rozwój języka w dłuższej perspektywie;) – d11wtq

Powiązane problemy