Получение числа параметров блока

Мне нужно получить количество параметров, которые принимает данный блок. Например:

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