2013-07-11 14 views
12

Utilizzando irb, possiamo elencare i metodi per oggetto particolare facendo seguente:C'è un modo per sapere quanti parametri sono necessari per un metodo?

"Name".methods 

Ma se voglio sapere quanti parametri sono necessari per un particolare metodo, come posso raggiungere questo obiettivo? Voglio dire c'è un modo (premendo un comando su irb), possiamo ottenere il numero di parametri per un particolare metodo (invece di fare riferimento a documenti)?

.methods restituisce solo i nomi dei metodi, non l'elenco dei parametri per il metodo.

risposta

33

È possibile utilizzare il metodo Method#arity:

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

Dalla documentazione Rubino:

Restituisce l'indicazione del numero di argomenti accettati da un metodo. Restituisce un numero intero non negativo per i metodi che accettano un numero fisso di argomenti . Per i metodi Ruby che accettano un numero variabile di argomenti, restituisce -n-1, dove n è il numero di argomenti richiesti. Per i metodi scritti in C, restituisce -1 se la chiamata accetta un numero variabile di argomenti .

Così, ad esempio:

# 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 


Aggiornamento Ho appena scoperto l'exitence di Method#parameters, potrebbe essere molto utile:

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

Grazie voi !!!!! – TDHM

8

È possibile utilizzare arity

Restituisce un'indicazione del numero di argomenti accettati da un metodo. Restituisce un numero intero non negativo per i metodi che accettano un numero fisso di argomenti. Per i metodi Ruby che accettano un numero variabile di argomenti, restituisce -n-1, dove n è il numero di argomenti richiesti. Per i metodi scritti in C, restituisce -1 se la chiamata accetta un numero variabile di argomenti.

Esempio da 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 
Problemi correlati