Object.const_getをハックした話

大変厳しい監視にも負けず、普通にRubyの話をします。

文字列のクラス名をクラスにするには、Rubyの場合evalとかもあるけれど(参照: Class.forNameはどう書くのか、コメントも)、 Object.const_get を使うのが一番安全な気がします。変なコードをねじ込まれてもNameErrorになるだけですし。

irb(main):001:0> Object.const_get("String")
#=> String
irb(main):002:0> Object.const_get("String").new
#=> ""

でもこれ、たとえば Net::HTTP みたいな名前空間付きのクラスを呼ぶとエラーになりますんよ。

irb(main):001:0> require 'net/http'
=> true
irb(main):002:0> Object.const_get("Net::HTTP")
NameError: wrong constant name Net::HTTP
	from (irb):2:in `const_get'
	from (irb):2

なので、以下のようなメソッドをつくりました。

nested_const_get.rb

1
2
3
4
5
6
7
8
9
10
class Object
  def self.nested_const_get(*args)
    stack = (args[0] =~ /::/) ? args[0].split("::") : args
    klass = Object
    while const = stack.shift
      klass = klass.const_get(const)
    end
    klass
  end
end
irb(main):001:0> require 'nested_const_get'
#=> true
irb(main):002:0> Object.nested_const_get("String")
#=> String
irb(main):003:0> require 'net/http'
#=> true
irb(main):004:0> Object.nested_const_get("Net::HTTP")
#=> Net::HTTP
irb(main):005:0> Object.nested_const_get("Net::HTTP").start("blog.udzura.jp", 80)
#=> #<Net::HTTP blog.udzura.jp:80 open=true>
irb(main):006:0> Object.nested_const_get("Net::HTTP::Get")
#=> Net::HTTP::Get
irb(main):007:0> Object.nested_const_get("Net::HTTP::Get::METHOD")
#=> "GET"

ハックというほどでもないですね。一応、何かの役に立つこともあろうかと。

最近作ったもの@03/07

totteさんの厳しい監視にも負けず元気です。

某おいちゃんさんがほぼ毎日更新してて凄いので,僕も少しはブログ頑張ります。

3月6日

m_201003061919504b922c466bb3b

  • 豚肉,ニラ,白菜などの炒め煮
    • 西友(生命線)で豚の千切りとニラを味付けしたものが安かったので作った。
  • ポテトサラダ
  • ほうれん草のおひたし
    • 初めて作った。
    • ほうれん草茹でる→冷やす→絞る→切る→200ccのだし汁に大さじ1の醤油

3月7日

m_201003072103024b9395f6693c2

  • カレー
    • 新ジャガイモ  1個
    • ニンジン  1/3本
    • タマネギ  1/2個
    • タケノコ水煮  1/2個
    • 豚ロース  200g 四角く切る
    • 水  400cc
    • カレー粉  1/4+α箱分
    • 気を遣ったことは,とにかく材料をあらかじめ炒める。
    • チーズ入れたら美味しかった。
    • ジャワカレーじゃなくてゴールデンカレー辛口が安かったので使った。普通にこの辛さなら好きなので問題ない
  • 赤だし(インスタント)

* * *

週末は料理作る習慣がついたので,たまにうpしますかね。

近況

生きてますし、ブログも更新したい気持ちはあります。

最近は,触ったことのないSQL ServerにRuby接続するのを一日で覚えたり,触ったことのないCapstranoのレシピをWebistranoに移行するとかそういう感じです。

もう少し落ち着いたら何か書きます。