Obtaining number of block parameters

后端 未结 2 2009
粉色の甜心
粉色の甜心 2021-02-14 11:38

I need to obtain the number of parameters a given block takes. For example:

foobar(1,2,3) { |a, b, c|
}

def foobar(x, y, z, &block)
  # need to obtain numbe         


        
相关标签:
2条回答
  • 2021-02-14 11:54

    When you materialize a block with &, it becomes a Proc object, which has an arity method. Just be careful - it returns the one's complement if the proc takes a *splat arg.

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

    (Answer via "The Ruby Programming Language" book.)

    0 讨论(0)
  • 2021-02-14 12:08

    Is this what you're looking for...

    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
    

    See also - A Ruby HOWTO: Writing A Method That Uses Code Blocks from codahale.com

    0 讨论(0)
提交回复
热议问题