Как я могу найти имена переменных аргумента, переданных в блок - PullRequest
3 голосов
/ 28 октября 2009

Я пытаюсь выполнить метапрограммирование и хотел бы узнать имена переменных, переданных в качестве аргументов блока:

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

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

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

Я не совсем уверен, как различать переменные, определенные вне блока, и аргументы блока в этом списке. Есть ли другой способ отразить это?

Ответы [ 2 ]

3 голосов
/ 28 октября 2009

Вот как вы можете сказать в 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 голос
/ 28 октября 2009

Что касается решения ruby ​​1.9, я не уверен на 100%, но ruby ​​1.9.2 добавляет метод 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]]

Не уверен, что у них есть решение и для параметров блока.

...