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クラスをどういう形で継承しているのかが気になってきた。

次回はそのあたりを調べつつ、分かったことを書いていきたいと思います。