局所変数の作り方
代入されると局所変数ができるのだとしたら、その場所の環境を使って代入文をevalすれば局所変数を別の箇所で作ることができるのではないかのテストです。
make_localvarで局所変数を作ろうと思ったのですが、以下の通り、結果は失敗でした。ri variableでさがしてみましたが、適当そうなメソッドは見つかりませんでした。
def make_localvar(sym, value, binding) eval("#{sym} = #{value}", binding) end def rubyco a = 1 b = 2 make_localvar(:c, 3, binding()) d = 4 p [a, b, c, d] end rubyco #=> undefined local variable or method `c' for main:Object (NameError)
疑問:make_localvar(sym, ...)でシンボルsymという名前の局所変数をmake_localvarの呼び出し側に作る方法はあるのでしょうか。
追記:id:sumimさん、ささださんからの情報で、以下ならOKとのこと。情報ありがとうございます。局所変数は作られていて、ただし与えたBindingオブジェクト上(?)で、ということと理解しました。
def make_localvar(sym, value, bnd) eval("#{sym} = #{value}", bnd) end def rubyco a = 1 b = 2 make_localvar(:c, 3, binding) d = 4 p [a, b, eval("c", binding), d] end rubyco #=> [1, 2, 3, 4]
さらに追記:ささださんから「binding メソッドは binding を作るメソッド (となる予定) なので、上記例では不適切です」とのこと。情報ありがとうございます。とりあえずメモしておきます。