2014-01-21 24 views
4

我發現紅寶石負載路徑是一個數組,很多項目都使用這樣的:

$:.unshift(File.expand_path("../../lib", __FILE__)) 

它可以將本地文件添加到紅寶石路陣列的前端,使我們要求或負載。

所以,我希望知道爲什麼我們不使用push在數組末尾添加文件?

回答

8

我們假設你有一個「date.rb」文件(爲什麼不),你想加載這個文件,而不是標準庫的日期。

如果使用append,當您撥打require 'date'時,您的文件將永遠不會被加載,因爲它位於數組的末尾,並且之前會找到標準日期。

因此,如果你在前面加上負載路徑的路徑,你不要冒險優先查找

2

這是因爲CONCAT是一個陣列添加到另一個。如果不更改,請將的任何項目添加到列表的開頭。而在負載路徑的情況下,順序是重要的,所以將它添加到開始是重要的,因此例如鏟子<<(),將項目添加到結束時,將不能滿足:

["a", "b"].concat(["c", "d"]) #=> ["a", "b", "c", "d"] 
["a", "b"].unshift("c").unshift("d") #=> ["d", "c", "a", "b"] 
["a", "b"] << "c" << "d" #=> ["a", "b", "c", "d"] 

首先,獲取lib目錄:

File.expand_path("../../lib", __FILE__) 
#=> "/home/foo/lib/" #Note this is a string! 

然後添加到$:.,包含當前載荷路徑。例如:

$:. 
#=> ["/usr/local/lib/site_ruby/1.9.1", "/usr/lib/ruby/1.9.1/i686-linux"] 

通過unshifting它,你將它添加到負載路徑列表的開頭:

$:.unshift(File.expand_path("../../lib", __FILE__)) 
#=> ["/home/foo/lib", "/usr/local/lib/site_ruby/1.9.1", "/usr/lib/ruby/1.9.1/i686-linux"] 

然而,一個CONCAT不僅將它添加到年底,還需要一些額外的醜陋語法,[]圍繞字符串傳遞它作爲一個項目從一個數組:

$:.concat([File.expand_path("../../lib", __FILE__)]) 
    #=> ["/usr/local/lib/site_ruby/1.9.1", "/usr/lib/ruby/1.9.1/i686-linux", "/home/lib"] 
+0

感謝您的答覆。我很抱歉誤解了方法concat。我的意思是追加元素到數組中。這是'推'的方法。 – wonderflow

相關問題