イントロスペクション

今日はイントロスペクションを学習。javaでいうリフレクションってやつです。
では早速。

methods = "a".methods

ってやると、文字列aのメソッドが配列の形で取得できる。特定のメソッドを取得するには以下のようにする。

method = "a".method("*")

ちなみに、この「*」もメソッドだったんですねぇ。ってことで、以下の二つは同じ動作をします。

# 両方とも結果はaaaaaとなる
"a" * 5
"a".*(5)

取得したmethodを実行するには以下のようにする。

method.call(5) # aaaaaとなる

あと、こんな書き方も。これも同じ結果になる。

"a".send("call", 5) # aaaaaとなる


ちなみにjavaのリフレクションだとこんな感じ。

String str = "a";
str.getClass().getMethod("concat").invoke(str, "aaaa"); // aaaaaとなる

Stringクラスからメソッド情報を取得してから実行しようとするので、どのインスタンスのメソッドとして実行するの?っていう情報を渡さないといけない。これはこれで分かりやすいから好きだけど、やっぱrubyの方が簡単ですな。