2016-03-02 24 views
13

C'è un modo per creare un metodo che può accettare un parametro, ma può anche essere chiamato senza uno, nel qual caso il parametro è considerato nil come il seguente?Un metodo con un parametro opzionale

some_func(variable) 

some_func 

risposta

34
def some_func(variable = nil) 
    ... 
end 
+3

Quindi, ovviamente, uno deve in qualche modo fferentiate tra default nil ed esplicito nil (se è importante) :) –

+3

Questo è ciò che 'def some_func (variable = (variabile_was_not_passed = true; nil)) "l'idioma è per. –

+0

@ JörgWMittag puoi spiegare come funziona? Grazie! – dowi

12

Oltre alla possibilità più evidente di parametri con valori predefiniti, che Sawa ha già mostrato, usando array o hash potrebbe essere utile in alcuni casi. Entrambe le soluzioni conservano nil come argomento.

1. Ricevere come array:

def some_func(*args) 
    puts args.count 
end 

some_func("x", nil) 
# 2 

2. Inviare e ricevere come hash:

def some_func(**args) 
    puts args.count 
end 

some_func(a: "x", b: nil) 
# 2 
+0

quale è lo scopo di usare '* arg' e' ** arg' invece di solo 'arg'? –

+4

@ sagarpandya82 '* arg' raccoglie gli argomenti come una matrice. Senza il '* dovresti chiamare' some_func (["x", nil]) '. '** arg' raccoglie tutti gli argomenti con nome. Senza '**' accetterebbe solo un singolo argomento senza nome o un numero qualsiasi di argomenti con nome. – bogl

3

È inoltre possibile utilizzare un hash come argomento e avere più libertà:

def print_arg(args = {}) 
    if args.has_key?(:age) 
    puts args[:age] 
    end 
end 

print_arg 
# => 
print_arg(age: 35, weight: 90) 
# => 35