概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: 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
が返ります。