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の対象としています。
概要
原著者の許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。