Rubyメタプログラミング事始め 番外その1
さて前前回attr_readerを再実装することでメタプログラミングの事始めとしたかったのですが、
それよりもModuleクラスが気になって仕方なかったので調べてみることにしました。
Rubyにはmoduleという宣言がありますが、Moduleは大文字なので違うものなのでしょうか?
とりあえず、Moduleクラスのオブジェクトを作ってみてmethodsを実行してみることにしました。
m = Module.new m.methods
結果は非常に長く
["const_get", "public_instance_methods", "autoload?", "freeze", "const_missing", "included_modules", "==", "__jtrap_kernel", "instance_method", "public_class_method", "ancestors", "<", "list", "extended", "protected_method_defined?", ">", "===", "private_instance_methods", "hash", "class_variables", "<=", "method_defined?", "instance_methods", "class_variable_defined?", "name", "private_method_defined?", "const_set", "autoload", "include?", "protected_instance_methods", "module_eval", "included", "initialize_copy", "<=>", "constants", "private_class_method", "trap", "to_s", "public_method_defined?", "class_eval", ">=", "const_defined?", "methods", "to_a", "__send__", "extend", "nil?", "=~", "object_id", "protected_methods", "method", "inspect", "tainted?", "is_a?", "__id__", "instance_variable_defined?", "instance_variable_get", "frozen?", "respond_to?", "instance_eval", "instance_variable_set", "untaint", "clone", "display", "send", "private_methods", "equal?", "singleton_methods", "eql?", "instance_exec", "type", "dup", "kind_of?", "instance_of?", "id", "taint", "class", "instance_variables", "public_methods"]
となっています。
この中にはこの間使ったclass_evalは入っているのですが、
あれ〜attr_accsessor, attr_reader, attr_writerがどれも入っていません。
なんでだろう?ということでwebをうろついて見ることにしました。
するとRubyリファレンスのModuleの中身を見てみるとprivateメソッドになってるんですね。
道理でmethodsでは現れないわけで・・・w
う〜ん今度はModuleクラスをどういう形で継承しているのかが気になってきた。
次回はそのあたりを調べつつ、分かったことを書いていきたいと思います。