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.
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. –
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. –
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 ... –