8
6

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_relativeとautoload

Last updated at Posted at 2016-12-15

要はなんでautoload_relativeが無いの?って話です。
#requireとrequire_relative
あるスクリプトで、同じディレクトリのスクリプトをrequireしたいとき、よく

require './hoge'

または

require_relative 'hoge'

とします。
ただし両者は同じではなく、スクリプトのあるディレクトリ以外から実行したときに、requireのほうではカレントディレクトリを探してしまうので意図した結果になりません。
リファレンスマニュアルによると、require_relativeは

require File.expand_path(relative_feature, File.dirname(__FILE__))
とほぼ同じです。

とあります。

#autoload
Kernel#autoloadまたはModule#autoloadは、ある定数が読み込まれたときに初めてファイルをrequireするように予約するメソッドです。
別ファイルにある、使うかどうかわからないクラスを必要なときだけ読み込むのによく使われます。

autoload :Hoge, './hoge'
Hoge.new #このタイミングで./hoge.rbが読み込まれる

ただリファレンスマニュアルによると、読み込むときに使われるのはKernel#requireなので、'./hoge'という書き方は上に書いたのと同じ問題があるわけです。回避策としては

autoload :Hoge, File.expand_path('hoge', File.dirname(__FILE__))

とするか、ロードパスにディレクトリを追加するかの2つです。
どっちもめんどくさいですね

やっぱり、require_relativeがあるならautoload_relativeもあるべきだと思うんです(´・ω・`)
なので誰かruby-coreに提案してください(丸投げ)

8
6
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
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?