79
60

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

外部ファイル読み込み時の「require」と「require_dependency」の違い

Last updated at Posted at 2014-10-24

##はじめに
railsを使ってモジュールを読み込むときはrequireを使っていましたが、require_dependencyなるものを聞いたので紹介します。

##現象(事の発端)
railsで自作モジュールを作成してrequireで読み込んでいたのですが、モジュールを編集して再度実行するとNoMethodとなって読み込んでくれないことがありました。
スペルミスったかな?と思って確認しても間違いは見当たらず。
この原因としてrequireの処理内容を理解していなかったということがわかりました。

##「require」と「require_dependency」
外部ファイル読み込み時にはおなじみの「require」と、「require_dependency」というものもあります。
この2つの特徴はざっとするとこんな感じ。

  • 「require」
    1. rubyの組み込み関数
    2. 引数で指定したrubyファイル(.rb)を読み込む
    3. 既に読み込み済みのファイルなら読み込まない
    4. キャッシュ済みの場合はそちらを読み込む
  • 「require_dependency」
    1. railsが定義した独自メソッド
    2. 引数で指定したrubyファイル(.rb)を読み込む
    3. 既に読み込み済みのファイルなら読み込まない
    4. キャッシュ済みであっても再読み込み(load)

この2つの違いは、loadを使って読み込むかどうかです。
require_dependencyは、developmentモードで実行しているときはloadを使って読み込まれます。
productionモードで実行しているときはrequireを使って読み込まれるようです。
ということで、この2つ何が違うかというと、
developmentモード時は ロード対象のrubyファイルが変更されている時に再読み込みをするかどうか が異なっています。
require_dependencyは無条件にloadするので変更点があった場合はその変更が反映されます。

開発中はよく変更がありますよね。そんなときrequire_dependencyを使っていればキャッシュしてようが再読み込みして変更点を反映してくれます。
そのままproductionモードで実行しても処理はrequireを使って読み込まれるので問題なしです。
開発中はrequire_dependencyを使うと便利ですね!

require_dependencyrailsの独自メソッドなのでお気をつけ下さい

##おわりに
もっとrailsのコード読んで早く知っておけばよかったです。
もっと注意深く読んで見ます。
今回はこちらの記事を参考にさせてもらいました。ありがとうございます。

requireとrequire_dependencyとRuby 1.8.7とRuby 1.9.2
http://masamitsu-murase.blogspot.jp/2011/11/requirerequiredependencyruby-187ruby.html

require_dependencyとrequireの違い
http://d.hatena.ne.jp/sai-ou89/20081218/1208940536

79
60
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
79
60

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?