【Ruby】requireで外部ファイルを読み込む

Ruby

requireメソッドとは

Rubyのライブラリ(.rb, .so, .o, .dll など)を読み込むメソッド

require(feature)
#=> boolean

読み込みが成功すると、true。失敗すると、falseを返します。

feature:ファイル名の文字列を絶対パスあるいは相対パスで指定します。

絶対パス

絶対パスは階層構造の頂点(ルートディレクトリ)からの位置関係を記述する方式です。

ルートディレクトリから目的のディレクトリまでの道筋を省略なく記述します。


下記のようなディレクトリがあったとします。

main.rbからsub.rbを読み込む場合、

# 絶対パスの場合
require '/Users/ユーザー名/ruby/sub/sub' # .rbは省略できます

相対パス

現在いるファイルの位置(カレントディレクトリ)から外部ファイルの位置を記述します。


先ほどと同じ例で、main.rbからsub.rbを読み込む場合、

# 相対パスの場合
require File.expand_path('sub/sub', File.dirname(__FILE__))
 :カレントディレクトリ(File.dirname(__FILE__))を記載しないと外部ファイルを読み込めません。

よくある間違った書き方

カレントディレクトリを . で指定している。

# 相対パス
require './sub/sub'
:このパスの指定方法は、そのファイルからの相対パスではなく、ruby コマンドを実行したディレクトリからの相対パスという意味になってしまうため、実行するディレクトリによって動作が変わってしまいます。

rubyディレクトリから実行するとsub.rbを読み込めるが

一つ上のディレクトリで読み込んでみると、ロードエラーが起きる

なので、相対パスを指定するときは、require_relativeメソッドを使用しましょう

require_relativeメソッド

require_relativeメソッドとは

現在のファイルからの相対パスで読み込みます。

require_relative('sub/sub')

先ほど紹介した相対パスの書き方とほぼ同じ動作をします。

# require_relative('sub/sub') と一緒
require File.expand_path('sub/sub', File.dirname(__FILE__))
Kernel.#require_relative (Ruby 3.2 リファレンスマニュアル)
require File.expand_path(relative_feature, File.dirname(__FILE__)) とほぼ同じです。

まとめ

requireメソッドで相対パスを指定するときに、ハマったので使い方をまとめてみました。

相対パスはrequire_relativeメソッドを使用しましょう。

コメント

タイトルとURLをコピーしました