概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Ruby 2.7 adds inherit as an optional argument to 
Module#autoload? - 原文公開日: 2019/10/24
 - 著者: Romil Mehta
 - サイト: Saeloun -- Ruby on Railsのコンサルティング会社で、Rails + React開発のほかに、React Nativeによるモバイルアプリ開発も手がけています。
 
訳注: 記事公開時点では日本語APIドキュメント(
Module#autoload?に反映されていません。
Ruby 2.7: Module#autoload?にinheritオプション引数が追加(翻訳)
Module#autoload
このメソッドは、指定のクラスやモジュールのファイルパスを登録し、初めて実際にアクセスされたときにそのモジュールをlazyに読み込みます。
例:
# person.rb
module Person
  autoload(:Profile, './profile.rb')
  puts "Profile is not loaded"
  Profile
  puts "Profile has been loaded"
end
# profile.rb
module Profile
  puts "Profile is loading"
end
それではperson.rbを実行してみましょう。
> ruby person.rb
Profile is not loaded
Profile is loading
Profile has been loaded
Module#autoload?
このメソッドは、モジュールが読み込まれていない場合は登録済みのファイルパスを返し、モジュールが読み込み済みの場合はnilを返します。
# person.rb
module Person
  autoload(:Profile, './profile.rb')
  p autoload?(:Profile)
  Profile
  p autoload?(:Profile)
end
# profile.rb
module Profile
  puts "Profile is loading"
end
> ruby person.rb
"./profile.rb"
Profile is loading!
nil
以上の例から、autoload?の最初の呼び出しでは登録済みのファイルパスが返ることがわかります。Profileを呼び出すとProfileモジュールが読み込まれます。2度目のautoload?呼び出しではモジュールが読み込み済みなのでnilが返ります。
今度は継承した場合の例を見てみましょう。
# person.rb
class User
  autoload(:Profile, './profile.rb')
end
# manager.rb
require_relative './person.rb'
class Manager < User
  p autoload?(:Profile)
end
# profile.rb
module Profile
end
> ruby manager.rb
"./profile.rb"
Managerクラスでautoload?を呼び出すと、親クラスで定義されているProfileのファイルパスが返ります。しかし、autoloadが子クラスで定義されているかどうかを確認する方法がありません。
@fb85a42で、Ruby 2.7のautoload?にModule#const_defined?と同様のinheritというオプション引数が追加されました。inheritの値はtrue(デフォルト)またはfalseです。
この新メソッドのシグネチャはautoload?(CONSTANT_NAME, inherit = true)です。
# manager.rb
require_relative './person.rb'
class Manager < User
  p autoload?(:Profile)
  p autoload?(:Profile, false)
end
> ruby manager.rb
"./profile.rb"
nil
1つ目のautoload?呼び出しでは、親クラスにautoloadが定義されているのでファイルパスが返ります。2つ目の呼び出しではinheritオプションがfalseなので先祖クラスの定数がチェックされなくなり、nilが返ります。