琉TechのRuby勉強会に参加して。
とりあえず、行った。(ちなみに、朝から頭痛い。
入門編でした。
Ruby歴about2年なので、場違い感を感じて、
ハンズオン講師サボさんに申し訳ないと思いながら、他の事としてました。
クラスメソッド・インスタンスメソッド・メタクラス・得意メソッドからの
主にmainオブジェクトと戯れていました。
ことの発端は、あおもじさんのレシーバーな質問。
Rubyはオブジェクト指向なので、メソッド呼び出しの際にどこに住んでいるメソッドなのかを示さなくちゃいけない。
だから、
トップレベルのmainオブジェクトに関数型のhogeメソッドを定義。
def self.hoge puts self puts 2 end puts self => main
selfがmainであり、かつ、mainにhogeが住んでいるので呼び出しました。
main.hoge
でもエラーが・。
調べると、関数型メソッドはprivateなのでレシーバーを直接指定すると呼び出せないみたい。
privateなので、もしかして、得意メソッド?って思ったので、
確認してみた。(weblog読めなくてw
a = "hoge" def a.tokui puts puts self puts 2 end a.tokui
呼べた。
これで、関数型メソッド=得意メソッドだと思う(いや、メタプログラミングorたのしいRubyに書いてあったんじゃないか........orz
こっから、
i = main main.hoge
的なことすれば、呼び出せたり?とか思った。
からの
mainの実装は?
トップレベルでのself.classがObjectなら、cレベルのObjectの定義を見ればわかりそう。
ってな感じで、cを読んでいました。
どうやら、
object.cのrb_obj_class()が.classの実装らしい(これはエスパーです。Ruby under a microscope読めば、できるようになります。
VALUE rb_obj_class(VALUE obj) { return rb_class_real(CLASS_OF(obj)); }
CLASS_OF(obj)はdefineされている。
#define CLASS_OF(v) rb_class_of((VALUE)(v))
rb_class_of
static inline VALUE rb_class_of(VALUE obj) { if (RB_IMMEDIATE_P(obj)) { ^ if (RB_FIXNUM_P(obj)) return rb_cFixnum; ^ if (RB_FLONUM_P(obj)) return rb_cFloat; ^ if (obj == RUBY_Qtrue) return rb_cTrueClass; ^ if (RB_STATIC_SYM_P(obj)) return rb_cSymbol; } else if (!RTEST(obj)) { ^ if (obj == RUBY_Qnil) return rb_cNilClass; ^ if (obj == RUBY_Qfalse) return rb_cFalseClass; } return RBASIC(obj)->klass; }
mainオブジェクトなので,
return RBASIC(obj)->klass;
がreturnされますね。
ここで 「mainオブジェクトな構造体のメンバーklassがObjectを示している」ことを自分なりにエスパー
でも、次のマクロで死にました(読めない
#define R_CAST(st) (struct st*) #define RBASIC(obj) (R_CAST(RBasic)(obj))
ってなわけで、楽しかったですw
16日のokinawarbでhanachinさんと一緒に読む予定です。(かなり楽しみ。
あと、1年時に負けてらんないですね。 一年生が純粋にプログラミングやっている姿を見ていると 負けそうで、負けてたまるかって思いました。