うえのです。

On Mon, 7 Oct 2002 01:48:46 +0900
Takashi Tsugoh <tks / dive-in.to> wrote:

> >ええと、僕も同じようなことを考えて書いたコードがあります。
> >  http://www.blue.sky.or.jp/atelier/ruby/wakaba/wakaba-0.1.0.tar.gz
> >の中の lib/wakaba/pbinding.rb ってファイルです。
>
> 参照させて頂きました。
>
> なるほど…、特異クラスを作り、その中で、メタ機能により削除可能な定数を経由して
> ローカル変数を生成するという方法なんですね。
> こんなやり方があったとは、目から鱗が落ちます。

最初に思いついたのはこんな感じでした。

  variables = { 'foo' => 1, 'bar' => 2 }
  keys = variable.keys
  carrier = keys.shift
  s = "def tmp_binding(#{carrier});"
  keys.each { |k| s << "#{k}=#{carrier}[#{k.dump}];" }
  s << "#{carrier}=#{carrier}[#{dump.carrier}];"
  s << "binding;end"
  module_eval s
  b = tmp_binding(variables)

複雑すぎるのでボツにしましたが ;p


> ただ、ソースを読ませて頂いていて二つほどわからないことがありました。
>
> 1) protected_binding の最後で
>      klass.module_eval{ :TOPLEVEL_BINDING, b }
>    とされているのはどういう理由なんでしょうか?
>    勉強不足のため理解できていません(汗)
>    (簡易版ではわからないままに付けています(^^;)

eval するスクリプトから本物の TOPLEVEL_BINDING を隠すための措置です。
気休めにはなるかな、と思い。

> 2) Wakaba::ProtectedBinding で
>      carrier << '_' while parameters.key? carrier
>    としていますが、これも理解できてません(汗)

parameters の中に 'VARIABLE' が含まれている可能性があるからです。
ProtectedEval#[]= では定数を拒否していますが、例えば lib/wakaba/erb.rb
の Wakaba::ERbViewEval クラスみたいな使い方をすることも想定してます。



 --  ----  -     - - -- -
うえの かつひろ <unnie / blue.sky.or.jp>