如何找到传递给块的参数变量的名称

时间:2009-10-28 04:55:29

标签: ruby metaprogramming

我试图做一些元编程,并想知道作为块参数传递的变量的名称:

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

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

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

我不太清楚如何区分块外定义的变量和此列表中的块参数。有没有其他方法可以反映这一点?

2 个答案:

答案 0 :(得分: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"

我当时不知道答案。

答案 1 :(得分:1)

至于ruby 1.9解决方案,我不是100%肯定,但ruby 1.9.2正在添加一个Method#参数方法,该方法返回以下数组中的params:symbols

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]]

不确定他们是否也有块参数的解决方案。