2009-07-03 25 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中繼,但不是在任何正式版本。我希望是否有辦法做到這一點,而無需下載單獨的gem /擴展模塊。

回答

29

當您使用&實現塊時,它將成爲一個Proc對象,它具有一個arity方法。只要小心 - 如果proc採用* splat arg,它會返回補碼。

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

(通過 「Ruby編程語言」 一書的答案)

+1

你打我吧:) +1 – Gishu 2009-07-03 04:44:50

+6

權。請注意`{||零}`將具有爲0的元數,但`{零}`將具有-1的元數。 – 2009-07-03 04:48:45

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 

又見 - A Ruby HOWTO: Writing A Method That Uses Code Blocks從codahale.com