module function Kernel.#autoload

autoload(const_name, feature) -> nil[permalink][rdoc]

定数 const_name を最初に参照した時に feature を Kernel.#require するように設定します。

const_name には、 "::" 演算子を含めることはできません(ネストした定数を指定する方法は後述)。

[PARAM] const_name:
定数をString または Symbol で指定します。
[PARAM] feature:
require と同様な方法で autoload する対象を指定します。
[EXCEPTION] LoadError:
featureのロードに失敗すると発生します。
------- /tmp/foo.rb ---------
class Bar
end
----- end of /tmp/foo.rb ----

autoload :Bar, '/tmp/foo'
p Bar #=> Bar

ネストした定義内の定数

const_name には、 "::" 演算子を含めることはできないので、 Kernel.#autoload ではトップレベルの定数しか指定できません。

Module#autoload と組み合わせることで、任意のクラス/モジュールの定数を autoload できます。やはりconst_name に "::" 演算子を含めることはできませんが、以下のように定義する事ができます。

------- /tmp/foo.rb ---------
class Foo
  class Bar
  end
end
----- end of /tmp/foo.rb ----

class Foo
  autoload :Bar, '/tmp/foo'
end
p Foo::Bar #=> Foo::Bar

あるいは、以下のようにもできます。

class Foo
end
Foo.autoload :Bar, '/tmp/foo'
p Foo::Bar #=> Foo::Bar

以下のように、autoload したライブラリがネストした定数を定義しない場合、一見、正常に動作しているように見えるので注意が必要です(警告メッセージが出ています)。

------- /tmp/bar.rb ---------
class Bar
end
----- end of /tmp/bar.rb ----

class Foo
  autoload :Bar, '/tmp/bar.rb'
end
p Foo::Bar
p Foo.autoload?(:Bar)
#=> -:4: warning: toplevel constant Bar referenced by Foo::Bar
#   Bar
#   nil

これは以下のようにネストせずに定義したのと同じことです。

class Foo
end
class Bar
end
p Foo::Bar
#=> -:5: warning: toplevel constant Bar referenced by Foo::Bar
#   Bar

[SEE_ALSO] Kernel.#autoload?,Module#autoload,Kernel.#require