Rubyには外部のソースファイルを取り込む機能としてrequireとloadの2つのメソッドが用意されています。requireメソッドはライブラリを取り込むために使ったことがある、という方が多いでしょう。
ではloadメソッドはいかがでしょうか。またloadメソッドとrequireメソッドの違い何で、いつ使えば良いのよく分からない、という方もいるしょう。今回はそのような方にloadメソッドの機能と、どんな使い方ができるかについて解説します。
Rubyのソースを取り込むには
Rubyは少ない記述で短く読み易いプログラムが作れる点がメリットですが、プログラムの全てを1つのファイルに記述する訳にはいきません。
プログラムが大きくなれば、その一部を別のファイルに分割して管理するのが一般的です。また、よく使う機能をクラスにまとめてライブラリとして利用する方法もよく使われます。
そのように分割したファイルをプログラムに取り込む機能がrequireメソッドとloadメソッドです。次から、requireメソッドとloadメソッドの概要について紹介します。
requireメソッドの基本
Rubyで外部のソースファイルを取り込む際によく利用されるメソッドがrequireです。Rubyのプログラムから参照するクラスを定義したソースファイルを取り込む場合などに使われます。
また、requireメソッドでは拡張子を省略できます。具体的には.rbのソースファイル、または.so、.o、.dllなどの拡張ライブラリの場合は、拡張子を省略した指定が可能です。
requireメソッドの使い方
require “ファイル名、または、ライブラリ名”
なお、requireメソッドは、同じファイルを一度だけしかロードしません。そのため、通常はRubyのソースファイルの最も上に記述します。
requireメソッドの使用例
require "./lib.rb"
この例では、カレントディレクトリにあるlib.rbを、一度だけ取り込みます。
loadメソッドの基本
Rubyには外部のソースファイルを読み込むメソッドとして、先ほど説明したrequireの他にloadメソッドもあります。なおrequireメソッドは1回しか使用できませんが、loadメソッドは何度も使用可能です。
loadメソッドの使い方
load “ファイル名”
loadメソッドの使用例
load "./default.rb"
この例ではカレントディレクトリにあるdefualt.rbを読み込みます。loadメソッドは何度でも読み込みできるので、ループの中で使用することも可能です。
requireとloadの使い分け
先ほど紹介したようにreqireはライブラリを読み込むためのメソッドです。プログラム内で共通に使うメソッドや定数を取り込む機能のため、Rubyのプログラムの先頭で1度だけ読み込む機能です。もし、requireを使用してしまうとエラーになるので注意してください。
それに対してloadメソッドは、ソースファイルの読み込みにしか扱えません。一方何度でも読み込めます。そのため変数の初期値を代入する処理を別ファイルに用意しておけば、loadメソッドでそのファイルを取り込むことで、何度でも変数を初期化できます。
requireメソッドとloadメソッドをうまく使い分けてください。
loadメソッドのファイル指定方法
loadメソッドでソースファイルを指定する方法として、絶対パスを使う方法と相対パスを使う方法とがあります。
どちらもLinuxのシェルの操作に慣れている方であれば使い慣れていることでしょうが、相対パスを使う場合にはカレントディレトリの指定が必要となるので注意してください。
次からloadメソッドのファイル指定方法について紹介します。
絶対パスで指定する
loadメソッドにRubyのソースファイルを指定する方法として、推奨されているのが絶対パスによる指定です。
なお絶対パスとは、ファイルシステムの最上位階層から順に階層となるディレクトリ名などを使ってファイルの所在を表現する方法です。LinuxやmacOSとWindowsでは書き方が違いますが、Linuxでは次のように記述します。
絶対パスで表現したファイルの例
/var/www/html/publuc/default.rb
上記の絶対パスで記述したファイルをloadメソッドで取り込む例
load("/var/www/html/publuc/default.rb")
相対パスで指定する
loadメソッドへのファイル名として相対パスによる指定も可能です。なお相対パスとは、現在のディレクトリを起点とし、ファイルのある位置をディレクトリ階層構造の相対的な位置で表現する方法で、LinuxやmacOSのシェルでディレクトリを移動するなどで使われます。
相対パスの例
../public/default.rb
これは現在のディレクトリから見て、一つ上のディレクトリにあるpublicの中のdefault.rbを表現する例です。
上記の相対パスで記述したファイルをloadメソッドで取り込む例
load("../public/default.rb")
loadメソッド使用時の注意点
Rubyのloadメソッドを利用して外部のソースファイルを取り込んだ場合、取り込んだ場所にファイルの内容が挿入される訳ではありません。実行しているプログラムの最も上位の階層に読み込まれると考えてください。
最初loadメソッドが使われた場合、プログラムの最も上の階層にファイルの内容が追加されます。そして2度目以降に読み込まれたら、最初にプログラムの最も上の階層に読み込まれた内容が書き換わると考えてください。
もし、ブロック内でloadメソッドを使いソースファイルを読み込んだとしても、ブロック内のローカルな変数は書き換えられません。
loadメソッドの使用例
次にloadメソッドを使い、クラス内ならどこでも利用できるインスタンス変数を初期化する例を紹介します。
インスタンス変数を初期化するファイルの例(/var/www/html/public/default.rb)
@id = 0 @name = "noname" @value = 0
loadメソッドの使用例
load("/var/www/html/public/default.rb") @id = 1 @name = "Tokyo" @value = 13960236 arr = [@id, @name, @value] p arr load("/var/www/html/public/default.rb") test = [@id, @name, @value] p test
この例では、loadメソッドを使い、@id, @name, @valueの3つのインスタンス変数を初期化し、その変数に値を代入して配列arrを作ったら、再度loadメソッドで3つの変数を初期化しています。
相対パスの具体的な使い方
先ほどloadメソッドで相対パスの使い方を紹介しましたが、Ruby on RailsによるWebシステムなどでは、起点となるディレクトリが解り難いかもしれません。そのような場合でも、起点となるディレクトリを指定する方法を使うことで、相対パスでloadメソッドを利用することが可能です。
次に相対パスで起点となるディレクトリを指定する方法を紹介します。
環境変数「$LOAD_PATH」に定義しておく
環境変数$LOAD_PATHにはRubyを実行するのに必要な標準ライブラリを参照するパスが格納されています。これにloadメソッドで取り込みたいファイルのディレクトリを追加することで、相対パスで参照する起点となるディレクトリを指定できます。
環境変数「$LOAD_PATH」の使用例
$LOAD_PATH << "/var/www/html/publuc/" load("default.rb")
環境変数「$:」に追加する
先ほど紹介した$LOAD_PATHを簡単にしたのが「$:」です。これも$LOAD_PATHと同じ書き方でloadメソッドの起点となるディレクトリを指定できます。
環境変数「$:」の使用例
$: << "/var/www/html/publuc/" load("default.rb")
「~」(チルダ)で環境変数 HOME の値を使う
LinuxやmacOSのシェルでは、~(チルダ)を使ってホームディレクトリからの相対パスを表現できます。もし、ホームディレクトリのあるアカウントでRubyを実行しているのなら、loadメソッドでも~を使用した相対パスを表現できます。
「~」(チルダ)の使用例
load("~/html/public/default.rb")
まとめ
Rubyで外部のソースリストを取り込む方法は、requireメソッドとloadメソッドがあり、loadメソッドを利用すると何度でも読み込めます。requireメソッドがライブラリを取り込む用途で使うメソッドなのに対し、loadメソッドは変数を初期化するなどプログラムの処理の中で何度も使う機能での使用に向いた機能です。
そして、loadメソッドではソースファイルを指定する方法として絶対パスと相対パスの2つの方法があり、相対パスで指定する際はシェルと同じ使い方ができます。相対パスは、うまく使えば本版環境と開発環境でディレクトリ構造の違いを吸収できる便利な機能です。
このような機能を理解したうえでloadメソッドを活用してください。