Je connais bien Ruby et j'ai découvert quelque chose qui m'a un peu dérouté.
J'ai défini une valeur de paramètre par défaut dans une signature de méthode.
Lors de l'appel de la méthode, j'ai passé un argument nil
à ce paramètre.
Mais la valeur par défaut n'a pas été attribuée. il est resté 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
Sortie:
Without nil check:
larry......................... 60
moe...........................
With nil check:
larry......................... 60
moe........................... 1000
Est-ce comportement attendu?
Qu'est-ce que Ruby-foo me manque?
On dirait que nil
n'est pas le même "pas de valeur" que j'ai l'habitude de penser à null
dans d'autres langues.
Le paramètre par défaut est utilisé lorsque le paramètre n'est pas fourni .
Si vous le fournissez sous la forme nil
, alors ce sera nil
. Alors oui, c'est le comportement attendu.
Si vous souhaitez définir une valeur par défaut, même si la valeur nil est transmise, tout en permettant d'appeler la méthode sans argument, vous devez définir la valeur par défaut sur nil et utiliser l'opérateur "ou égal à":
def foo(bar=nil)
bar ||= "default value"
puts bar
end
En Ruby, les méthodes retournent toujours quelque chose. Parfois, il n’ya rien à renvoyer (la requête dans la base de données est vide ou quelque chose comme ça). nil
est pour ces cas; Cela signifie quelque chose comme «rien ici», mais cela est une référence à un objet. Pour obtenir le comportement souhaité, ne passez aucun paramètre.
def talk(msg="Hello")
puts msg
end
talk #=> "Hello"
Essayez ... v.is_nil?
dans l'instruction if.