2013-07-11 117 views
12

使用irb,我們可以通過執行以下列出特定對象的方法:有沒有辦法知道一個方法需要多少個參數?

"Name".methods 

但是,如果我想知道有多少參數都需要一個特定的方法,我怎麼能做到這一點?我的意思是有什麼辦法(通過在irb上打一些命令),我們可以獲得特定方法的參數數量(而不是參考文檔)?

.methods只返回方法名稱,不返回方法參數列表。

回答

33

您可以使用該方法Method#arity

"string".method(:strip).arity 
# => 0 

從Ruby文檔:

返回由方法所接受的參數個數的指示。 爲採用固定數量的參數的方法返回一個非負整數。對於帶有可變參數個數的Ruby方法, 返回-n-1,其中n是所需參數的個數。對於用C編寫的方法 ,如果調用採用可變數量的參數 ,則返回-1。

因此,舉例來說:

# Variable number of arguments, one is required 
def foo(a, *b); end 
method(:foo).arity 
# => -2 

# Variable number of arguments, none required 
def bar(*a); end 
method(:bar).arity 
# => -1 

# Accepts no argument, implemented in C 
"0".method(:to_f).arity 
# => 0 

# Variable number of arguments (0 or 1), implemented in C 
"0".method(:to_i).arity 
# => -1 


更新我剛剛發現的Method#parameters的exitence,它可能是非常有用的:

def foo(a, *b); end 
method(:foo).parameters 
# => [[:req, :a], [:rest, :b]] 
+0

謝謝你!!!!! – TDHM

8

您可以使用arity

返回方法接受的參數個數的指示。返回具有固定數量參數的方法的非負整數。對於採用可變數量參數的Ruby方法,返回-n-1,其中n是所需參數的數量。對於用C編寫的方法,如果調用需要可變數量的參數,則返回-1。

來自實例ruby-doc

class C 
    def one; end 
    def two(a); end 
    def three(*a); end 
    def four(a, b); end 
    def five(a, b, *c); end 
    def six(a, b, *c, &d); end 
end 

c = C.new 
c.method(:one).arity  #=> 0 
c.method(:two).arity  #=> 1 
c.method(:three).arity #=> -1 
c.method(:four).arity #=> 2 
c.method(:five).arity #=> -3 
c.method(:six).arity  #=> -3 
相關問題