【Ruby入門】require(_relative)で外部ファイルを読み込もう!

こんにちは!フリーエンジニアとしてWebサイト制作などを主に行っております、かい@dikxs118です。

プログラミングをしていると、外部ファイルを読み込みたいという場面は多々あります。

というより必須です。

例えば自作のファイルを読み込んだり、モジュールを読み込んだりですね。

なので今日はRubyで外部ファイルを読み込む方法を、requireメソッドを中心として説明していきます。

具体的には、

・外部ファイルの読み込みとは?
・requireメソッドの使い方
・loadメソッドの使い方

という基本的な内容から、

・require_relativeとは

など応用的な内容について解説していきます。

それでははりきっていきましょう!

目次

外部ファイルの読み込みとは

では実際の使い方に移る前に外部ファイルを読み込むとはどういうことのなのかということについて説明します。

例えば、ファイルのコードが長くなりすぎてしまった場合や、使いまわす同じコードなどは別ファイルで管理したほうが楽ですよね。

そんな別ファイルで管理させたものを実際の実行ファイルで読み込むときに外部ファイルを読み込む必要があります。

外部ファイルを読み込みたいときは主に

・Ruby標準のライブラリを読み込む
・自作の外部ファイルを読み込む
・誰かの作った便利な外部ファイルを読み込む

の3つくらいですね。

そして外部ファイルを読み込む関数には大きく2種類あるので、説明していきます。

Rubyの標準ライブラリを読み込む時のみ、挙動が違ったりもしますので詳しくは以降の章で見ていきましょう!

requireメソッドを使おう

requireメソッドはライブラリやファイルを読み込むために使用をします。

requireメソッドの特徴

ではまずはrequireメソッドの特徴からみていきましょう。

requireメソッドの特徴は

・読み込みが早い
・拡張子は省略可能
・カレントディレクトリを示す./を付ける必要がある

くらいでしょうか。

最後のカレントディレクトリの部分のみわかりづらいと思うので実際にコードを見て説明します。

カレントディレクトリとはファイルが今いるディレクトリのことをいいます。相対パスでは./と書きます。

例えば、rubyディレクトリ(フォルダ)の中にa.rbとb.rbというファイルがあり、a.rbでb.rbを読み込みたいとしましょう。

ファイルとディレクトリ(フォルダ)の関係は以下の図のようになります。

ファイルとディレクトリの配置図

また、ファイルの中身はそれぞれ以下のようであったとします。

#a.rb
require './b'
#b.rb
puts "hello"

a.rbからb.rbを呼び出すわけですが、ここでrequire ‘b’とするとエラーとなってしまいます。

requireメソッドはカレントディレクトリを起点とした相対パスでファイルを探すので、一度カレントディレクトリに戻ってから、b.rbを参照する形になります。そのため、単にrequire ‘b’と書くだけではa.rbからは参照できなかったわけです。

requireの参照順序

そこで、require ‘./b’としてa.rbを実行してみると

実行結果

hello

ときちんとrequireしていることがわかりますね。

最後に中級者以降向けの情報になりますが、requireメソッドは絶対パスでもファイルを取得することは可能です。ただ、環境ごとの違いが大きくなるため、本章では相対パスのみの説明に限定しました。

requireメソッドを使ってみよう

ではrequireメソッドの詳しい使い方についてみていきましょう。

Ruby標準ライブラリを読み込む

Rubyの標準ライブラリを読み込むためには、requireの後にライブラリ名を入れることで読み込むことができます。

ライブラリとはRuby側で用意されている、ある機能がまとまったもののことですね。

例えば、日付を扱うクラスであるdateライブラリを使用するときは、以下のようにしてください。

require 'date'

puts Date.today.to_time

実行結果

2017-07-31 00:00:00 +0000

外部/自作のファイルを読み込む

次に外部/自作のファイルを読み込みたい時について見ていきましょう。

長いファイルを分割したり、使いまわすコードをモジュール化したときなどによく使います。

外部/自作ファイルを読み込む時は、「相対パス」でファイルを指定する必要があります。

例えば下のような、b.rbというファイルを読み込みたい時は

#a.rb
require './b'
user = User.new
user.name
#b.rb
class User
  def name
    puts 'userです'
  end
end

このように、相対パスを使用することで、ファイルの読み込みを行うことができます。

実行結果

userです

相対パスで指定せず、ファイル名だけで指定してしまうとエラーが出るので、気をつけるようにしましょう。

#a.rb
require 'b'
 
user = User.new
user.name

実行結果

:in `require': cannot load such file -- b (LoadError)

require_relativeを使ってみよう

いちいち、カレントディレクトリを示す./をつけるのはめんどくさい、わかりにくいという人もいると思います。

そんな人は、require_relativeを使いましょう。

このメソッドを使用すれば、カレントディレクトリを指定しなくても、ファイルを読み込むことができます。

#a.rb
require_relative 'b'
user = User.new
user.name
#b.rb
class User
  def name
    puts 'userです'
  end
end

実行結果

userです

このようにファイル名を指定するだけで、ファイルを読み込めていることがわかります。

つまり、requireメソッドはカレントディレクトリからの相対パスを指定する必要があり、require_relativeは呼び出し元ファイルが存在するディレクトリからの相対パスを記述します。

loadメソッドもあるよ

そしてもう一つ外部ファイルを読み込むためのメソッドとして、loadメソッドがあります。

しかし、通常ではloadメソッドは使われることがありません。

なぜならrequireメソッドは読み込み済みのライブラリを再読み込みしないため、実行スピードがloadよりも勝るということです。

そのため、初学者の方は基本的にrequireメソッドを使用してライブラリを読み込むと考えて問題ありません。

しかし、カレントディレクトリを示さなくても良いなどのメリットもあるので使い方をサクッと見ておきましょう。

使い方と言ってもrequireをloadにするだけです。

#a.rb
load 'b.rb' #拡張子は省略できない
#b.rb
puts "hello"

実行結果

hello

こうですね。うまくいきました。

Rubyを独学で頑張っているけど先が見えない方のために

独学でRubyを頑張っているわけだけど、先が見えない・・・

そんな方、実はいらっしゃるのではないでしょうか?

いや、おれは違うぞ。先のキャリアもしっかり見えてるし、独学の成果も出てきている

そんな方であれば、これから先の話は必要ないでしょう。そっとページの閉じるボタンを押しましょう。

しかし、「先が見えない」と心の底では勘付いているそこの奥さん。この先を読み進めて、一緒に課題を深堀りしていきましょう。

なぜ「先が見えない」という不安や悩みを抱えてしまうのか

さて、「一寸先は闇だ・・・」とお悩みを抱えている方に、なぜ独学でRubyを勉強しているにもかかわらず、そのような現状を抱えてしまうのか、一緒に考えていきましょう。

先が見えない現状を踏まえ、課題として考えられるものは以下のどれかに該当するでしょう。

  • プログラミングの上達が見えない
  • プログラミングを継続できない気がする
  • プログラミングスキルを習得した姿がイメージできない
  • プログラミングスキルを活かした仕事を獲得するイメージができない

これらのどれかに該当することによって、「なんとなくプログラミング学習をしている」という状態になってしまいます。

これらの要因は、三日坊主になる理論と同じなんですが、「プログラミング学習をしなきゃ」とプログラミング学習を頑張ってしまっている状態になってしまっています。

受験勉強をやった経験のある方なら頭がもげるほどに首を縦に振ってしまう方も多いのですが、「今日も5時間勉強するぞ」や「今日はこの章を終わらすぞ」というように、学習を進めることに意識が行き過ぎてしまうと、ある程度学習を継続した後に「先が見えない・・・」となってしまいます。

未来に光を当て、プログラミング学習を「成果が出るもの」にするために

先ほど、「なぜ先が見えないという悩みや不安を抱えてしまうのか」という疑問に対しての答えを示していきました。

これらの課題というのは、独学をしていれば9割の方がぶつかってしまう壁だそうで、いわば、あるあるの現象なのです。

独学をしていて、「なんか前に進めていないぞ」と感じるのはこのせいなんですね。甘く見がちですが、非常にやっかい。

これがさらにやっかいさを極めているのは、上記に挙げた課題のほとんどが、1人で解決できないものばかりだからです。

実は、これらのほとんどが経験者に助けてもらいながら解決しないと、すぐに違う方向へと流れてしまいます。

そう言い切れるのは、以前の私もそうだったからです。

エンジニアやプログラマー関連のキャリアに詳しい方や現役のエンジニアに相談しながら修正を加え、学習を実践して今があります。

そうは言っても、周りにそういう人がいないし・・・

という方もいるでしょう。そういう時にこそ、プログラミングスクールの無料カウンセリングを利用するのです。

営業をかけられて時間の無駄に終わるでしょ?

という考えに辿りついてしまいますよね。結論から言うと弊社では、そういった強引な営業等を行うことはありませんので、安心して受講できます。

「プログラミング学習の先ある未来」を光で明るく照らすには、弊社の無料カウンセリングがぴったりだと断言できます。それくらい無料カウンセリングに自信を持っているのです。

さらに、無料カウンセリングには以下の3大特典もついてきます!

  • 「最短1ヶ月で開発ができる学習方法」電子書籍(非売品)
  • 効率的なオリジナル学習カリキュラム
  • 未経験の転職(フリーランス)を可能にするキャリアサポート

上記の特典だけでも他のスクールにはないポイントだと自信を持っている無料カウンセリング特典です。

ただプログラミング学習をする毎日から、ワクワクしながらプログラミング学習できる毎日に変える体験を一度でいいのでしてみませんか?

無料カウンセリング予約はこちら

まとめ

本記事でrequireメソッドついて基本的な使い方、さらにはloadメソッドとの比較についてご紹介しました。

外部ライブラリを読み込んで自前のソースに利用することはよくあるケースです。

外部ライブラリの読み込み場所によって、requireメソッドとrequire_relativeメソッドを使い分けることができれば、コーディングミスを防ぎ読みやすいコードを作成することが可能です。

もし、今後requireメソッドで使い方に迷うことがあれば、ぜひこの記事を思い出して下さいね。

この記事を書いた人

日向徹かこよすぎか

kaikaikai8217@gmail.com

目次