Получение числа параметров блока
Мне нужно получить количество параметров, которые принимает данный блок. Например:
foobar(1,2,3) { |a, b, c|
}
def foobar(x, y, z, &block)
# need to obtain number of arguments in block
# which would be 3 in this example
end
Это возможно в 1,9 багажнике, но не в официальном выпуске. Я надеялся, что если это можно сделать, не загружая отдельный модуль gem/extension.
Ответы
Ответ 1
Когда вы реализуете блок с помощью &, он становится объектом Proc, который имеет метод arity
. Просто будьте осторожны - он возвращает одно дополнение, если proc принимает аргумент * splat arg.
def foobar(x, y, z, &block)
p block.arity
end
(Ответ через книгу "Язык программирования Ruby" ).
Ответ 2
Это то, что вы ищете...
def foobar(x, y, z, &block)
# need to obtain number of arguments in block
# which would be 3 in this example
case block.arity
when 0
yield "i have nothing"
when 1
yield "I got ONE block arg"
when 2
yield "I got TWO block args"
when 3
yield "I got THREE block args"
end
end
foobar(1,2,3) { |a, b, c|
puts a
}
Выходы:
D:\ruby\bin>ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
D:\ruby\bin>ruby c:\Temp.rb
I got THREE block args
См. также - Ruby HOWTO: Написание метода, использующего блоки кода на codahale.com