Ce qui se passe en réalité :
# Assign a value of "meh" to scope, which is OUTSIDE meth and equivalent to
# scope = "meth"
# meth(1, scope)
meth(1, scope = "meh")
# Ruby takes the return value of assignment to scope, which is "meh"
# If you were to run `puts scope` at this point you would get "meh"
meth(1, "meh")
# id = 1, options = "meh", scope = "scope"
puts options
# => "meh"
Il n'y a pas de support* pour les paramètres nommés (voir ci-dessous pour la mise à jour 2.0). Ce que vous voyez est juste le résultat de l'assignation de "meh"
a scope
étant transmis en tant que options
valeur en meth
. La valeur de cette affectation est bien sûr "meh"
.
Il y a plusieurs façons de procéder :
def meth(id, opts = {})
# Method 1
options = opts[:options] || "options"
scope = opts[:scope] || "scope"
# Method 2
opts = { :options => "options", :scope => "scope" }.merge(opts)
# Method 3, for setting instance variables
opts.each do |key, value|
instance_variable_set "@#{key}", value
# or, if you have setter methods
send "#{key}=", value
end
@options ||= "options"
@scope ||= "scope"
end
# Then you can call it with either of these:
meth 1, :scope => "meh"
meth 1, scope: "meh"
Et ainsi de suite. Il s'agit de solutions de contournement pour pallier l'absence de paramètres nommés.
Edit (15 février 2013) :
* Bien, au moins jusqu'à la prochaine version de Ruby 2.0 qui prend en charge les arguments liés aux mots clés ! A l'heure où j'écris ces lignes, il en est à la release candidate 2, la dernière avant la sortie officielle. Bien que vous deviez connaître les méthodes ci-dessus pour travailler avec 1.8.7, 1.9.3, etc., ceux qui peuvent travailler avec des versions plus récentes ont maintenant l'option suivante :
def meth(id, options: "options", scope: "scope")
puts options
end
meth 1, scope: "meh"
# => "options"