關於 ruby 的 require 會搜尋哪些來源與位置以及順序?


#1

在上課時知道了 ruby 程式分三塊 Core API , Std-Lib API , Gem
Core API 可以直接使用
而 StdLib API 要 require 才能用
而 Gem 則需要先安裝然後 require 使用

但是自己實際寫的程式碼例如有 main.rb myclass.rb 兩隻程式
在 main.rb 內用 require ‘myclass’ 引入 myclass.rb 會出現 cannot load such file 錯誤
需要改成 require ‘./myclass’ 才能正常

而瀏覽 Gem 所安裝的各種 Libs 程式碼內卻不需要多加 ./ 就可以直接引用
請問這樣的差異是有什麼規則與設定來決定的呢?
是否跟系統環境變數 PATH 有關係?


#2

找文件原來 require 是在 Kernel module 內
其中有提到如果不是使用絕對路徑的話,就會搜尋在 $LOAD_PATH ($:) 內的目錄列表

看來好像是在 ruby 某個版本之後就沒有將目前目錄列在 $LOAD_PATH 內

$ irb 
irb(main):001:0> puts $LOAD_PATH
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/site_ruby/2.1.0
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/site_ruby/2.1.0/x86_64-darwin13.0
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/site_ruby
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby/2.1.0
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby/2.1.0/x86_64-darwin13.0
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/2.1.0
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/2.1.0/x86_64-darwin13.0
=> nil
irb(main):002:0> puts $:
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/site_ruby/2.1.0
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/site_ruby/2.1.0/x86_64-darwin13.0
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/site_ruby
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby/2.1.0
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby/2.1.0/x86_64-darwin13.0
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/vendor_ruby
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/2.1.0
/Users/allen/.rbenv/versions/2.1.2/lib/ruby/2.1.0/x86_64-darwin13.0
=> nil
irb(main):003:0> 

ruby 2.1.2 doc Kernel #require


#3

A…這篇單純還沒教而已

載入自己寫的東西可以有三種類型選擇:load / require_relative / require

以你的情況應該用 require_relative 即可,且打 “xxx.rb” 或 “lib/xxx.rb” 就好,相對位置即可


#4

居然在文件中沒有注意到有 require_relative
而且就在 require 的之後
真的是見樹不見林
原以為只能用程式去加工 $LOAD_PATH 來處理


#5

剩下後面的課會講到 __FILE____dir__ 的前世今生之類的Orz"…anyway一票的歷史包袱就是