/ /ブロックに渡された引数変数の名前を見つけるにはどうすればよいですか-ルビー、メタプログラミング

どのようにブロックに渡される引数変数の名前を見つけることができますか? - ルビー、メタプログラミング

私はいくつかのメタプログラミングをしようとしていますが、ブロック引数として渡された変数の名前を知りたいです:

z = 1 # this variable is still local to the block

Proc.new { |x, y| local_variables }.call

# => ["_", "z", x", "y"]

ブロック外で定義された変数とこのリストのブロック引数をどのように区別するかはよくわかりません。これを反映する他の方法はありますか?

回答:

回答№1の場合は3

ここに、Ruby 1.8でどのように伝えることができるかを示します。

>> z = 1
=> 1
>> Proc.new{|x| "z is #{defined? z}, x is #{defined? x}"}.call(1)
=> "z is local-variable, x is local-variable(in-block)"

しかし、 注意! これは「Ruby 1.9では動作しません-あなた」が取得します

=> "z is local-variable, x is local-variable"

そして、私はその答えを知りません。


回答№2の場合は1

ルビー1.9ソリューションに関しては、私は100%確信していませんが、ルビー1.9.2は:symbolsの配列でパラメータを返すMethod#parametersメソッドを追加しています

irb(main):001:0> def sample_method(a, b=0, *c, &d);end
=> nil
irb(main):002:0> self.method(:sample_method).parameters
=> [[:req, :a], [:opt, :b], [:rest, :c], [:block, :d]]

ブロックパラメーターのソリューションもあるかどうかはわかりません。