2009-10-07 20 views
4

我一直認爲這樣的事情醜陋:Ruby的require語句的漂亮版本?

require File.join(File.dirname(__FILE__), 'hirb/config') 

是否有一個漂亮的替代,也許一個爲Rails編寫?

require_relative 'hirb/config' 
require_relative '../another/file' 
+1

Ruby 1.9已require_relative - 儘管對於我的生活,我無法找到它的文檔或源此刻。無論如何,這可能有助於您找到源... – Telemachus 2009-10-07 19:14:52

+0

[鏈接到文檔](http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-require_relative)對於Ruby 1.9的'require_relative'。 – 2012-04-23 16:28:07

回答

4

您可以extend the kernel

module Kernel 
    def require_relative(path) 
     require File.join(File.dirname(caller[0]), path.to_str) 
    end 
end 
+2

...但你需要那個嗎? ;-) – 2009-10-07 21:17:26

+0

完美。謝謝。 – Mario 2009-10-11 04:21:41

+0

爲什麼Ruby本身不是原生的?這不是司空見慣? – Mario 2009-10-15 22:10:28

6

你可以做

Dir.chdir(File.dirname(__FILE__) do 
    require 'hirb/config' 
    require '../another/file' 
end 

無論這是否是更好的當然是口味的問題。

+0

由於需要但一致的代碼(例如'File.join(File.dirname(__ FILE__),path)'這裏的東西)代碼很醜,抽象的抽象抽象! – 2009-10-07 17:20:23

+1

我覺得這個不會解決問題,因爲__FILE__總是與它定義的文件相關,而不是它被調用的文件。 – tadman 2009-10-07 17:44:57

+0

@tadman:哦,對。該死的。 – sepp2k 2009-10-07 17:55:57

7

最好的方法可能是準備你的載入路徑,所以你不需要做所有這些。主模塊或init文件引入其他幾個位置並不是特別困難。

這也受到RUBYLIB環境變量以及-I命令行參數的影響。

$: << File.expand_path(File.join('..', 'lib'), File.dirname(__FILE__)) 
+0

調用者[0]表示你可以抽象 – jrhicks 2009-10-08 04:30:27

+1

如果你的圖書館是寶石(提示,提示),你可以免費得到這個。 – Jacob 2011-03-04 22:28:38