Ruby 中三種載入程式碼的機制(load, require, autoload)

Load

載入指定的 Ruby 檔案,寫幾次 load 就會執行幾次

# index.rb
puts 'first load'
load 'loader.rb'
puts 'second load'
load 'loader.rb'

# loader.rb
puts <<~TEXT
loading
----------
TEXT

輸出:

first load
loading
----------
second load
loading
----------

require

相比 load,只會執行一次,還有一個類似的叫 require_relative,跟 require 差別在於找檔案的起始點不同 require 會從 $LOAD_PATH 這個環境變數裡找,而相對路徑的 require 則比較適合用 require_relative

# index.rb
puts 'first require'
require './loader.rb'
puts 'second require'
require './loader.rb'

# loader.rb
puts <<~TEXT
loading.......
----------

TEXT

輸出:

first require
loading.......
----------

second require

autoload

autoload 會註冊 module 名稱在當前的 namespace,當之後訪問該 module 時,會使用 require 載入註冊時的檔案路徑

# index.rb
puts 'first autoload'
autoload :A, './loader.rb'
puts 'second autoload'
autoload :A, './loader.rb'

A.hi

# loader.rb
puts <<~TEXT
loading.......
----------

TEXT

module A
  def self.hi
    puts 'hi'
  end
end

輸出:

first autoload
second autoload
loading.......
----------

hi