2009-07-03 3 views
10

特定のブロックに必要なパラメータの数を取得する必要があります。例:ブロックパラメータの数を取得する

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トランクでは可能ですが、正式リリースではありません。私は別の宝石/拡張モジュールをダウンロードする必要なくこれを行う方法があれば願っていました。

答えて

29

&でブロックをマテリアライズすると、arityメソッドを持つProcオブジェクトになります。 procが* splat argをとる場合、補数を返します。

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

( "Rubyのプログラミング言語" ブック経由で回答。)

+1

あなたはそれに私を打つ:) +1 – Gishu

+6

右。 '{|| nil}は0のアリティを持ちますが、{nil}は-1のアリティを持ちます。 –

+0

こんにちはジャスティン、答えてくれてありがとう、これは私が必要としていたものです:) – Exponent

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 
} 

出力:

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 

他を参照 - codahale.comからA Ruby HOWTO: Writing A Method That Uses Code Blocks

+0

こんにちは紀州。記事のおかげで、私は間違いなくこれを読む必要があります。 – Exponent