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

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

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.

Ответы на вопрос(2)

Решение Вопроса

, он становится объектом Proc, который имеетarity метод. Только будьте осторожны - он возвращает комплемент, если процесс принимает аргумент * splat.

def foobar(x, y, z, &block)
  p block.arity
end

(Ответ через книгу "Язык программирования Ruby".)

 Exponent03 июл. 2009 г., 07:23
Привет, Джастин, спасибо за ответ, это именно то, что мне было нужно
 Gishu03 июл. 2009 г., 06:44
ты победил меня :) + 1
 Curt J. Sampson03 июл. 2009 г., 06:48
Правильно. Обратите внимание, что{ || nil } будет иметь арность 0, но{ nil } будет иметь арность -1.
 amoebe04 апр. 2013 г., 15:36
@ CurtSampson ForRUBY_VERSION => "2.0.0" я получаю ожидаемую арность 0 для{nil}

Это то, что ты ищешь ...

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
}

Outputs:

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

Смотрите также -A Ruby HOWTO: Написание метода, использующего блоки кода с сайта codahale.com

 Exponent03 июл. 2009 г., 07:23
Привет Гишу. Спасибо за статью, мне обязательно нужно это прочитать.

Ваш ответ на вопрос