私はこのコードを持っています:
l = lambda { a }
def some_function
a = 1
end
a
ラムダと、例のa
内部のようにすでに定義されている特別なスコープsome_function
、またはすぐ後に同じスコープでアクセスしたいだけです。
l = lambda { a }
a = 1
l.call
次に、を呼び出したときにl
、それはまだ独自のバインディングを使用していますが、呼び出された新しいバインディングは使用していないことがわかりました。
そして、私はそれを次のように使用しようとしました:
l.instance_eval do
a = 1
call
end
しかし、これも失敗しました。理由を説明できないのは不思議です。
解決策の1つがを使用していることは知っています。この場合eval
、バインディングを特殊化してテキストでコードを実行できますが、実際にはそのように使用したくありません。
そして、私はそれがグローバル変数またはインスタンス変数を使用できることを知っています。ただし、実際には私のコードはより深い組み込み環境にあるので、必要がなければ完成したパーツを壊したくありません。
Proc
ドキュメントでクラスを参照しましたが、のコンテキストを参照する関数名を見つけましたbinding
。Proc
関数はそのバインディングにアクセスする方法を提供するだけでしたが、を使用する場合を除いて、それを変更することはできませんBinding#eval
。テキストも評価しますが、これは私がやりたくないことです。
ここで問題は、これを実装するためのより良い(またはよりエレガントな)方法がありますか?または、使用eval
はすでに通常の方法ですか?
@Andrewに返信するために編集してください:
さて、これは字句パーサーを書いているときに遭遇した問題です。そこでは、少なくともaProc
と正規表現を含む固定数の項目で配列を定義しました。私の目的は、正規表現を照合し、特別なスコープでProcsを実行することです。ここで、Proceには、後で定義する必要のあるいくつかのローカル変数が含まれます。そして、私は上記の問題に遭遇しました。実際、私はその質問
と完全に同じではないと思います。私のものは、Procを渡す方法ではなく、Procにバインドする方法を渡す方法だからです。
@Niklas:あなたの答えを得ました、私はそれがまさに私が欲しいものだと思います。それは私の問題を完全に解決しました。