読者です 読者をやめる 読者になる 読者になる

KazuminEngine

プログラマーの日記

琉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年時に負けてらんないですね。 一年生が純粋にプログラミングやっている姿を見ていると 負けそうで、負けてたまるかって思いました。