2009-10-28 43 views
3

我試着做一些元編程,並想知道作爲塊參數傳遞的變量的名稱參數變量的名稱:我如何才能找到傳遞給塊

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

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

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

我不太清楚如何區分塊外定義的變量和列表中的塊參數。有沒有其他方式可以反映這一點?

回答

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" 

,我不知道答案,然後。

+0

謝謝,我從來沒有想到這一點。 – 2009-10-28 13:35:03

1

至於紅寶石1.9溶液我不是100%確定,但紅寶石1.9.2是添加方法#參數的方法,其返回在PARAMS的陣列:符號

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

不知道他們有塊參數的解決方案也是如此。