获取块参数的数量

Exp*_*ent 10 ruby methods

我需要获取给定块所需的参数数量.例如:

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
Run Code Online (Sandbox Code Playgroud)

这可以在1.9主干中使用,但不能在任何正式版本中使用.我希望有没有办法做到这一点,而无需下载单独的gem /扩展模块.

Jus*_*ove 31

使用&实现块时,它将成为Proc对象,它具有一个arity方法.要小心 - 如果proc采用*splat arg,它会返回一个补码.

def foobar(x, y, z, &block)
  p block.arity
end
Run Code Online (Sandbox Code Playgroud)

(通过"Ruby Programming Language"一书回答.)

  • 对.请注意`{|| nil}`将具有0的arity,但是`{nil}`将具有-1的arity. (6认同)

Gis*_*shu 8

这是你要找的......

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
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

另请参阅 - Ruby HOWTO:编写一个使用 codahale.com 代码块的方法