Par défaut les paramètres de la fonction de la commande
De la lecture à travers cette, j'en suis venu à la fraise sur les valeurs par défaut pour les arguments de la fonction:
fill = (container, liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
Que c'est bien, mais ensuite, j'ai essayé ceci:
fill = (container="mug", liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
alert fill(liquid="juice")
et a obtenu l'inattendu alerte avec "Filling the juice with coffee..."
. Alors j'ai essayé ceci:
fill = (container="mug", liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
alert fill(null, "juice")
et cela a fonctionné. Ce n'est pas assez. Est-il une meilleure façon, ou est-ce le idiomatiques façon de le faire?
- semble laid ou un goût bizarre, difficile d'appel
Vous devez vous connecter pour publier un commentaire.
fill = ({container, liquid} = {}) -> ...
si vous voulez être en mesure de faire appel à la fonction sans paramètres,fill()
. Aussi, vous pouvez utiliser des valeurs par défaut pour les paramètres positionnels:fill = (quantity="500 ml", {container, liquid} = {}) -> ...
peut être appeléfill()
,fill "1L"
ou avec n'importe quelle combinaison des paramètres nommés, par exemplefill "1L", liquid: "juice"
.Amir et Jeremy déjà. Comme ils le soulignent,
container="mug"
en fonction de la liste d'arguments est vraiment juste un raccourci pourcontainer ?= "mug"
dans le corps de la fonction.Laissez-moi simplement ajouter que lors de l'appel de fonctions,
signifie la même chose que dans le JavaScript: tout d'Abord, affectez la valeur
"juice"
à laliquid
variable; puis de passerliquid
le long defill
. CoffeeScript ne pas faire quelque chose de spécial ici, etliquid
a la même portée dans cette situation, comme il le ferait à l'extérieur de l'appel de la fonction.Par ailleurs, j'ai suggéré que l'argument par défaut de la syntaxe devrait être rendu plus puissant par permettant d'arguments pour être ignorées (par exemple
(first, middle ?= null, last) ->
permettrait d'affecter des valeurs à desfirst
etlast
si seulement deux arguments ont été passés), et que le?=
syntaxe devrait être utilisé plutôt que=
. Vous pourriez exprimer votre soutien à cette proposition ici: question 1091.optional function arguments
fonctionnent bien dans des frameworks comme jQuery, mais ils nuisent à la lisibilité un peu. Si il y a des tonnes de fonctions qui utilisent ce style dans un morceau de code, je pourrais avoir à regarder à chaque définition de la fonction à avoir un sentiment de ce que les paramètres sont. Par exemple:animate 100, ->
vsanimate {delay:100}, ->
. Juste pour que vous pouvez également faireanimate ->
.Actuellement, il n'y a aucun moyen d'appeler avec des arguments nommés. Elle aurait besoin de connaître les arguments (noms, fonctions et/ou des valeurs par défaut) à la vocation du site, qui n'est pas toujours faisable en javascript/coffeescript.
Au lieu de cela, si vous avez beaucoup d'arguments et que vous voulez leur nom et ont des valeurs par défaut, vous pourriez faire quelque chose comme ceci: