2016-03-02 14 views
13

Czy istnieje sposób na wykonanie metody, która może przyjąć parametr, ale może być również wywołana bez niego, w którym to przypadku parametr jest uznawany za następujący: nil?Metoda z opcjonalnym parametrem

some_func(variable) 

some_func 

Odpowiedz

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

Następnie, oczywiście, trzeba jakoś fferentiate pomiędzy domyślnym zero i explicite zero (jeśli to ma znaczenie) :) –

+3

To właśnie 'def some_func (variable = (variable_was_not_passed = true; zero)) 'idiom jest dla. –

+0

@ JörgWMittag Czy możesz wyjaśnić, jak to działa? dzięki! – dowi

12

Oprócz bardziej oczywistą opcją parametrów z wartościami domyślnymi, że Sawa już pokazano, za pomocą tablic lub skrótów może być przydatna w niektórych przypadkach. Oba rozwiązania zachowują nil jako argument.

1. Odbierz jako tablicy:

def some_func(*args) 
    puts args.count 
end 

some_func("x", nil) 
# 2 

2. wysyłać i odbierać jako hash:

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

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

jaki jest cel używania '* arg' i' ** arg' zamiast tylko 'arg'? –

+4

@ sagarpandya82 '* arg' pobiera argumenty jako tablicę. Bez '*' musiałbyś wywołać 'some_func ([" x ", nil])'. '** arg' zbiera wszystkie nazwane argumenty. Bez '**' zaakceptowałby tylko jeden nienazwany argument lub dowolną liczbę nazwanych argumentów. – bogl

3

Można również użyć skrótu jako argument i mają większą swobodę:

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

print_arg 
# => 
print_arg(age: 35, weight: 90) 
# => 35 
Powiązane problemy