2011-07-26 33 views
2

我剛開始學習Ruby來自Java。在Java中,您可以使用包進行更大型的項目。有什麼和Ruby相同嗎?或者什麼是實現包裝設置的最佳方式?在Ruby中使用包?

我現在正在做的方式是'將所有需要的類加載到我的新Ruby文件中。沒有辦法告訴我當前的Ruby類在同一個文件夾中使用所有其他的Ruby類嗎?

乾杯, 邁克

回答

1

有3種封裝加載的紅寶石:

  • 明確裝入一個庫require
  • 隱式加載使用autoload
  • 庫導入庫gem

require方法是最直接的,並具有加載和執行該參數的效果ticular文件。由於該文件可能會轉到require其他人,爲方便起見,您可能會立即加載相當多的文件。

autoload方法聲明瞭一個模塊,如果您引用給定的符號,將會加載該模塊。這是避免加載不需要的東西的常用方法,但如果您需要,可以自動使用它們。大多數大型庫都使用這種加載方法來避免將每個類同時轉儲到內存中。

gem方法是一種更正式的打包庫的方式。儘管將應用程序拆分爲一個或多個寶石的情況並不常見,但這是可能的並且提供了一些優勢。沒有義務將gem作爲開源發佈,您可以將其保留爲私有,並通過您自己的渠道(例如專用網站或git存儲庫)分發,或者根據需要複製並安裝.gem文件。

話雖這麼說,如果你想自動加載了一堆東西圖書館,你可以採取這種做法:

# lib/example.rb 
Dir.glob(File.expand_path('example/**/*.rb', File.dirname(__FILE__))).each do |file| 
    require file 
end 

,當你調用require 'example'這將加載lib/example所有.rb文件。

0

我理解你的感受。從Java等其他語言來的時候,你必須面對一個普通的問題。我會說嘗試學習Ruby模塊,但你應該得到更長的回覆。所以我的建議是閱讀一本好的Ruby書,比如Eloquent Ruby。

+0

模塊是如何與這個問題相關的? –

+1

當你來自Java組織的東西是一件很難理解的事情。我知道Mike在問如何加載文件夾中的所有文件。我只是想給他一個關於更復雜問題的暗示。如果你試圖加載文件夾中的所有文件,那麼你並沒有組織代碼。我完全知道他的感覺,因爲我擁有相同的Java背景。 – lucapette

+0

他在談論相當於Java的封裝。這是模塊和要求,而不僅僅是要求。 – Andy

1

您可能希望使用require而不是加載,因爲它應該處理循環引用。

如果你想抓住給定文件夾中的所有文件,這是很容易的:

Dir.foreach("lib"){|x| require x} 

你的另一種選擇是有一個手工所需要的所有文件,並讓您的其他文件要求。

你也應該看看用module塊封裝庫中的代碼,給它們自己的命名空間。我認爲這是一個領域 - 也許是唯一一個--Ruby比Python或Java更強大的領域。