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

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

evalにハッシュを渡せるように

ruby

RubyのERB#run、ERB#resultがbindingを受け取るのが気持ち悪いので、ハッシュを受け取れるようにしたらどうか、という話。

def hashing(pair)
  Class.new {
    pair.each {|key, value|
      define_method(key.to_sym) { value}
    }
  }.new.instance_eval { binding }
end

hashingにhashを渡すと、キー名がインスタンスメソッドとして定義されて、そのメソッドはキーに対応する値を返す、という仕組み。Perlの定数の仕組みをイメージして書いた。

def eval(source, context = binding)
  super(source, context.instance_of?(Binding) ? context : hashing(context))
end

そして、evalを上書きすると、

eval("puts message", :message => "Hello, World!") #=> "Hello, World!"

のように使える。
このままでは副作用が多すぎるが、うまく改造すれば便利に使えそうではある。