Tech Racho エンジニアの「?」を「!」に。
  • 開発

Ruby 2.7: Module#autoload?にinheritオプション引数が追加(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

訳注: 記事公開時点では日本語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が返ります。

関連記事

Ruby 2.7: ハッシュからキーワード引数への自動変換が非推奨に(翻訳)

Rails 6のcookieに「purpose」メタデータが追加(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。