【Ruby】【メタプログラミング】require,load,クラス定義,プログラム終了のトレーシング
■topic summary
study about tracing require, load, define-class, exit-program
ポイント
・at_exitはブロックを登録(再定義しない)
・loadメソッドはファイル名を指定(※1)
※1
(ここでは簡単な例としてライブラリをロードしてみたが、)フルパスを指定して リソースファイルをロードしたりするのがloadのまっとうな使いかたである。
http://www.loveruby.net/ja/rhg/book/load.html
module ClassTrace alias original_require require alias original_load load T = [] def require(file) T << ["require: ", file, caller[0]] original_require(file) end def load(file) T << ["load: ", file, caller[0]] original_load(file) end def Object.inherited(c) T << ["inherited: ", c, caller[0]] end at_exit{T.each {|t| p t}} end include ClassTrace require "bigdecimal" load "test.rb" class Test end
■実行結果
["require: ", "bigdecimal", "C:/Users/HOGE_ADMIN/Desktop/test/arrays.rb:22:in `<main>'"] ["require: ", "rubygems/requirement", "C:/Ruby200/lib/ruby/2.0.0/rubygems/dependency.rb:4:in `<top (required)>'"] ["inherited: ", Gem::Dependency, "C:/Ruby200/lib/ruby/2.0.0/rubygems/dependency.rb:6:in `<top (required)>'"] ["inherited: ", Gem::PathSupport, "C:/Ruby200/lib/ruby/2.0.0/rubygems/path_support.rb:6:in `<top (required)>'"] ["inherited: ", BigDecimal, "C:/Ruby200/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'"] ["load: ", "test.rb", "C:/Users/HOGE_ADMIN/Desktop/test/arrays.rb:23:in `<main>'"] ["require: ", "benchmark", "test.rb:1:in `<top (required)>'"] ["inherited: ", Benchmark::Job, "C:/Ruby200/lib/ruby/2.0.0/benchmark.rb:306:in `<module:Benchmark>'"] ["inherited: ", Benchmark::Report, "C:/Ruby200/lib/ruby/2.0.0/benchmark.rb:344:in `<module:Benchmark>'"] ["inherited: ", Benchmark::Tms, "C:/Ruby200/lib/ruby/2.0.0/benchmark.rb:380:in `<module:Benchmark>'"] ["inherited: ", Test, "C:/Users/HOGE_ADMIN/Desktop/test/arrays.rb:24:in `<main>'"]
ふむふむ。