けいじゅ@今はフリー(^^;;;です. これはこれで, 実現するかどうかはともかく, もうちょっと深めたいのでつき あって下さい. In [ruby-list :03419 ] the message: "[ruby-list:3419] Re: meta programming features ", on Jul/24 07:34(JST) matz / netlab.co.jp (Yukihiro Matsumoto) writes: >| a = "Foo" >| proc{|a| a = "Bar"}.call >| print a >ちゃいます.この場合 a は(イテレータブロックの外で代入されて >いるので)常に静的ローカル変数です.ですから,この結果は > >======================= > Bar > >です.動的ローカル変数とは「イテレータブロックの中で最初に代 >入された変数」のことです. あ. そうでした. この場合は, パラメータとして|a|しているけど, 静的ロー カル変数の`a'と同じものになるんですね? >|別のものですか... > >evalに渡す文字列はrubyプログラムですが,"|a| A = a"は完全な >rubyプログラムではありませんから.たとえば, > > ruby -ce "|a| A = a" > >してみれば分かると思いますが. ああ. なるほど. それはそうですね. そういう意味では, ruby "print ARGV.inspect" "foo" は実現できるので, eval "print ARGV.inspect", a_binding, "foo" みたいな方法は可能かな? 変数名はARGVじゃない方が良いとは思いますが. >|うーん. なるほど... ところで, バインディングってどんなオブジェクトなん >|です? > >構造はProcと同じです. BindingはProcのスーパクラスなのかな? >ちなみにProcをbindingとして渡しても動作します.Procはイテレータがスタッ >ク上に持っている情報をオブジェクト化したもので,だいたい以下のような >ものを持っています. > * 静的ローカル変数フレーム > * 動的ローカル変数フレーム > * self > * 現在のclass(定数・メソッドの定義先) > * そのほか付加的な値 そうすると, procは既存のバインディングに対して動的ローカル変数を追加し た新たなバインディングを生成しているともいえますね. 通常のProcは現在のバインディングを引き継ぎますが, 明示的にバインディン グを指定して, かつ, 動的ローカル変数とその値の設定が無理なくできれば求 めるものができそうな. aa = "foo" Proc.new(a_binding, :aa) 上記は, あるバインディングa_bindingに 変数aaを動的ローカル変数aaとして 追加しているところです. __ .........................................石塚 圭樹@今はフリー(^^;;... ------->>また, アドレス変わりました!! e-mail: keiju / bc.mbn.or.jp <<---