autoload(const_name, feature) -> nil
[permalink][rdoc]定数 const_name を最初に参照した時に feature を Kernel.#require するように設定します。
const_name には、 "::" 演算子を含めることはできません(ネストした定数を指定する方法は後述)。
------- /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