Shibuya.rb

最近Shibuya.rbというのを同僚のid:bash0C7が始めました。
そういうことで僕はその集まりに遊びにいきました。
Shibuya.rbは素人でもいいらしいので、僕は図にのって簡単にLT的なものをした。


実はお昼休みにメタプログラミングRubyの読書会があったのでそれに行った。
そこで、ちょっと質問をした
phpだとこんな事ができる。

$str = "Unlearned";
$unlearned_instance = new $str();

上記プログラムでUnlearnedクラスがあった場合、Unlearnedのインスタンスを取得できる。
文字列から、その文字列の示すクラスのインスタンスが欲しかった場合、rubyだったらどうやってやればいいのだろう。

僕は昔書いたrubyでこんな風にやっていて、スゴく気持ち悪かった。

str = "Unlearned"
unlearned_instance = eval(str + ".new")

そしたらid:tadasyがActive Supportだとかをしらべてくれて、
Class.const_getをつかって実装されていると教えてくれた。

str = "Unlearned"
class = Class.const_get str
unlearned_instance = class.new

なんかこんな感じの方がevalつかうより気持ちよく感じる。
最終的にはちょっとだけ頭をつかってid:tadasyにいろいろ教えてもらいつつ、
こんな感じになった。

class String
    def constantize
        Class.const_get self
    end 
end

str = "Unlearned"
unlearned_instance = str.constantize.new

んで、僕はこの内容を話してみた。というわけです。
とても面白い会合でした。