Edited at

requireとrequire_relativeとautoload

要はなんで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に提案してください(丸投げ)