私はいくつかのメタプログラミングをしようとしていますが、ブロック引数として渡された変数の名前を知りたいです:
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]]
ブロックパラメーターのソリューションもあるかどうかはわかりません。