2011-07-05 20 views
4

Rubyでは、local_variablesevalを使用してプログラムでローカル変数に簡単にアクセスできます。私は本当に、このようなRubyの異なるバインディングからのローカル変数へのアクセス

Fooは、いくつかの外部モジュールである
# define a variable in this scope, such as 
x = 5 
Foo.explore_locals # inside the Foo#explore_locals method, access x 

のような単一のメソッド呼び出しを使用してこれらの変数へのメタプログラミングのアクセス権を持っていると思います。考え方は、ローカル変数を表示し、エクスポートすることです。

explore_localsの方法はどうすればよいですか?これを可能にする方法はありますか?どうしても必要な場合は、私はそれが

Foo.explore_locals binding 

可能性が推測するが、これはあまりエレガントな私が考えているアプリケーションのためです。ここで

答えて

1

それは、呼び出し側のバインディングを取得するための組み込みの方法はありません残念です。ブロックトリックは、この質問に対する通常の答えのようです。

しかし、より古い1.8 Rubyバージョンのbinding_of_callerのために存在していた別の「トリック」があります。 quixが1.9に移植したように見えます。それを確認することができます:

https://github.com/quix/binding_of_caller

1

は一例である(それが可能であれば私はむしろ避けるだろう余分な括弧{}が必要です):

module Foo 
    def self.explore_locals &block 
    p block.binding.eval 'local_variables' 
    end 
end 

local_1 = 3 
Foo.explore_locals{} # shows [:local_1, :_]