ブロックをメソッドに渡し、ブロック自体にバインディングがないことを確認して、{class/module/instance}_eval
単に送信するのではなく、別のインスタンスのコンテキストでのみ (を使用して)実行できるようにすることはでき:call
ますか?
ここに動機付けの例があります
module M
class File
end
end
M.module_eval "File" # => M::File
M.module_eval do File end # => File
M::File
上記の最後の行で、の代わりにクラスを返すようにしたいと思い::File
ます。
心に留めておくべきもう 1 つの点は、私の具体的なアプリケーションでは、モジュールM
が動的に (メソッド呼び出し内で) 作成されるのに対し、静的に (上記のように Ruby ファイル内で) 作成されることです。実際の動作は次のとおりです。
def create_module(name, &block)
mod = Module.new
Object.send :const_set name, mod
mod.module_eval &block
end
create_module :M do
file_cls = Class.new
M.send :const_set, :File, file_cls
File # => ::File (and I would like M::File)
end
ありがとう。