我發現紅寶石負載路徑是一個數組,很多項目都使用這樣的:
$:.unshift(File.expand_path("../../lib", __FILE__))
它可以將本地文件添加到紅寶石路陣列的前端,使我們要求或負載。
所以,我希望知道爲什麼我們不使用push在數組末尾添加文件?
我發現紅寶石負載路徑是一個數組,很多項目都使用這樣的:
$:.unshift(File.expand_path("../../lib", __FILE__))
它可以將本地文件添加到紅寶石路陣列的前端,使我們要求或負載。
所以,我希望知道爲什麼我們不使用push在數組末尾添加文件?
我們假設你有一個「date.rb」文件(爲什麼不),你想加載這個文件,而不是標準庫的日期。
如果使用append,當您撥打require 'date'
時,您的文件將永遠不會被加載,因爲它位於數組的末尾,並且之前會找到標準日期。
因此,如果你在前面加上負載路徑的路徑,你不要冒險優先查找
這是因爲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"]
感謝您的答覆。我很抱歉誤解了方法concat。我的意思是追加元素到數組中。這是'推'的方法。 – wonderflow