【一人 Ruby Advent Calendar 2017】Ruby で外部ファイルを読み込むメソッドいろいろ【23日目】

一人 Ruby Advent Calendar 2017 23日目の記事になります。
今回は require などの外部ファイルを読み込むメソッドを簡単にまとめてみます。

Kernel.#require

引数の Ruby のライブラリを読み込みます。
ここでいう Ruby のライブラリとは、

などのファイルを指します。

# Ruby のスクリプロファイルを読み込む
require "hoge.rb"

# 動的ライブラリを読み込む
require "foo.o"

また、拡張子を省略して記述することも出来ます(その場合は *.rb を優先して両方のファイルを検索します。

# hoge.rb を優先しつつ hoge.o などを読み込む
require "hoge"

同じファイルは複数回読み込みません。
ファイルが絶対パスの場合はそのファイルを、相対パスの場合は組み込み変数 $: から検索し、最初に見つかったファイルを読み込みます。
また、『require してるファイルのカレントディレクトリ』は検索の対象にならないので『require しているファイルからの相対パス』で読み込みたい場合は注意してください。

# こんな感じで require しているファイルからの相対パスでファイルは読み込めない
require "../hoge/foo"

Kernel.#require_relative

『現在のファイルからの相対パス』で require します。
以下のような挙動とほぼ同じです。

require File.expand_path({ファイル名}, File.dirname(__FILE__))

require しているファイルからの相対パス』のファイルを読み込みたい場合は require ではなくて require_relative を使用してください。

Kernel.#load

require と違い再ロード可能です。
相対パスの場合は『カレントディレクトリ』も含めて検索します。
また、require は拡張子を省略した場合は自動的に *.rb などを補完しますが、load は『拡張子を補完しない』ので拡張子を記述する必要が有ります。

Kernel.#autoload

指定した定数の名前を最初に参照した時に自動で require を行います。

# この時点ではまだ "hoge" は読み込まれない
autoload(:Hoge, "hoge")

# 最初に Hoge を参照した時に require("hoge") が実行される
p Hoge

まとめ

メソッド名 検索対象 拡張子 再ロード
require $: のパス 省略化 されない
require_relative 現在のファイルからの相対パス 省略化 されない
require $: とカレントディレクト 省略不可 される


基本的に『ライブラリを読み込む際は require』を使い、『相対パスで読み込みたい場合は `require_relative』を使う、みたいな感じで使い分けるとよいと思います。