Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Ruby: 動的モジュールを手軽にビルドしてキャッシュできるスニペット(翻訳)

概要

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

日本語タイトルは内容に即したものにしました。

Ruby: 動的モジュールを手軽にビルドしてキャッシュできるスニペット(翻訳)

include MyModule.with_argument('foo')すれば利用可能になるような動的モジュールを作りたい方へ: コードを6行書けば、動的モジュールをお手軽に作れるようになります。書き方は以下のとおりです。

require 'dynamic_module'

module MyModuleMaker
  extend DynamicModule

  module_function

  def make_module(arg)
    dynamic_module("ModuleForArg#{arg}") {
      # モジュールのコード(ここでargを使える)
    }
  end
end

これを以下のようにincludeできます。

class MyClass
  include MyModuleMaker.make_module('Foo')
end

これは、MyModuleMaker::ModuleForArgFooというモジュールをビルドしてincludeします。

同じ引数を渡してincludeすると、ビルド済みの既存の定数名が返されます。

スニペット全体を以下に示します。

# 動的モジュールをキャッシュしながらビルドする便利技
#
# 使い方:
#
# require 'dynamic_module'
#
# module MyModuleMaker
#   extend DynamicModule
#
#   module_function
#
#   def make_module(arg)
#     dynamic_module("ModuleForArg#{arg}") {
#       # モジュールのコードをここに書く
#     }
#   end
# end
#
# class MyClass
#   include MyModuleMaker.make_module('Foo')
# end
#
# このincludeを実行すると、MyModuleMaker::ModuleForArgFooという
# 新しいモジュールが作成される。
# 以後のincludeでは既存のモジュールが再利用される。
module DynamicModule
  def dynamic_module(const_name, &block)
    return const_get(const_name) if const_defined?(const_name)
    const_set const_name, Module.new(&block)
  end
end

本記事のコードスニペットはOBSD Licenseの対象としています。

関連記事

[Ruby] module_functionでモジュールの特異メソッドを簡潔に書く


CONTACT

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