我试图做一些元编程,并想知道作为块参数传递的变量的名称:
z = 1 # this variable is still local to the block
Proc.new { |x, y| local_variables }.call
# => ['_', 'z', x', 'y']
我不太清楚如何区分块外定义的变量和此列表中的块参数。有没有其他方法可以反映这一点?
答案 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]]
不确定他们是否也有块参数的解决方案。