2012-05-08 10 views
19

Jestem nowy dla Ruby i natknąłem się na coś, co mnie trochę zdezorientowało.Dlaczego domyślne wartości parametrów Ruby nie są przypisywane do zerowych argumentów?

Ustawiam domyślną wartość parametru w sygnaturze metody.

Podczas wywoływania metody przekazałem do tego parametru argument o wartości nil.

Ale domyślna wartość nie została przypisana; pozostało nil.

# method with a default value of 1000 for parameter 'b' 
def format_args(a, b=1000) 
    "\t #{a.ljust(30,'.')} #{b}" 
end 

# test hash 
dudes = {}; 
dudes["larry"] = 60 
dudes["moe"] = nil 

# expecting default parameter value 
puts "Without nil check:" 
dudes.each do |k,v|  
    puts format_args(k,v) 
end 

# forcing default parameter value 
puts "With nil check:" 
dudes.each do |k,v|  
    if v 
    puts format_args(k,v) 
    else 
    puts format_args(k) 
    end 
end 

wyjściowa:

Without nil check: 
    larry......................... 60 
    moe........................... 
With nil check: 
    larry......................... 60 
    moe........................... 1000 

Jest to oczekiwane zachowanie?

Jakiego rubiego-foo brakuje mi?

Wygląda na to, że nil to nie to samo "brak wartości", że jestem przyzwyczajony do myślenia o null w innych językach.

+3

Który inny język użyłby wartości domyślnej, jeśli podasz 'null' ?! 'null' jest prawidłową wartością w każdym znanym mi języku, który używa' null', tak jak 'nil' jest właściwą wartością w Ruby. –

+0

Przekazanie wartości funkcji, dowolnej wartości, nawet 'nil' dla _no value_, przesłania wartość domyślną. Jeśli chcesz wartość domyślną, pomiń argument. –

+0

Tak, masz absolutną rację. Nie znaczy to, że inne języki traktują to inaczej; to jest, że moje mentalne modele są spieprzone i trochę mnie to zabiera, żeby przywrócić głowę do kodu ... –

Odpowiedz

41

Parametr domyślny jest używany, gdy parametr nie jest podany.

Jeśli podasz je jako nil, to będzie to nil. Tak, tak, to jest oczekiwane zachowanie.

0

W języku Rubinowym metody zawsze zwracają coś. Czasami nie ma nic do zwrócenia (zapytanie w bazie danych pojawia się puste lub coś w tym stylu). nil jest dla tych przypadków; Oznacza to coś takiego jak "nic tutaj", ale jest to odniesienie do obiektu. Aby uzyskać pożądane zachowanie, po prostu nie przekazuj żadnego parametru.

def talk(msg="Hello") 
    puts msg 
end 

talk #=> "Hello" 
+4

Lub użyj 'nil' jako domyślnego argumentu i wykonaj' msg || = "Hello" 'wewnątrz funkcji. –

0

try ... v.is_nil? w if.

26

Jeśli chcesz ustawić wartość domyślną, nawet jeśli nil jest przekazywana, i nadal pozwalają wywołując metodę bez argumentów trzeba ustawić domyślną wartość do zera i użyć „lub równe” operator:

def foo(bar=nil) 
    bar ||= "default value" 
    puts bar 
end 
Powiązane problemy