2014-10-20 58 views
2

Python有模塊和包,而包有__init__.py文件,所以如果我導入一個名爲foo的包,解釋器將查找foo/__init__.pyRuby與python的對應__init__

我遇到了一些ruby代碼,其中不包括模塊,而是一個目錄:require 'core/utilts'coreutilts是目錄,而不是單個模塊文件。什麼是文件__init__.py的ruby中的等效項,或者當我需要這樣一個目錄時執行的文件是什麼utilts dir?它下面有很多ruby文件。

回答

5

你不能在Ruby中導入目錄。如果您正在運行require 'core/utils',則有一個文件,稱爲core/utils.rb。有可能是一個名爲core/utils/目錄,但它的utils.rb是通過require包括在內,它可能會包括文件從core/utils/

因此,您的問題的答案是:不,沒有等同於foo/__init__.py,但通常可以使用foo.rb完成同樣的事情,其中​​包括foo/中的其他文件。

+0

+1」有一個名爲core/utils.rb的文件。「這就是它似乎工作的原因。 – 2014-10-20 16:38:33

2

紅寶石有點不同。 ruby中的寶石或「庫」通常會修改LOAD_PATH常量,這是ruby解釋器在調用require時查找文件的位置。因此,標準gem通過將lib目錄附加到LOAD_PATH來工作,然後可能需要名稱空間在該目錄內的文件。這也是一個慣例,通常會有一個與可能需要的庫同名的文件,然後加載所有的依賴關係。

例如:用以下項目。

lib/ 
-- core/utils/ 
-- core/utils.rb 
core_utils.gemspec 

你會打電話:

require "core/utils" 

和utils.rb將加載內核中的所有文件/ utils的路徑。

3

紅寶石不支持加載整個目錄,但它很容易做的,如果需要,可以:

Dir.glob('lib/*.rb').map do |p| 
    require p 
end 

我用map這個,因爲它會返回require響應,從而可以看由於require對成功返回true,對失敗返回false,因此某些內容未能加載。失敗/錯誤意味着文件沒有被加載,因爲它不需要,通常這是因爲它已經被別的東西了。如果您不關心返回的值,請使用each而不是map

您也可以執行「Adding a directory to $LOAD_PATH (Ruby)」中提到的技巧,然後使用require,而沒有任何路徑作爲要加載的文件的前綴。 「