De nombreux langages ont la capacité de transmettre n'importe quel nombre d'arguments de fonction, mais chacun a des spécifications légèrement différentes.
En langage C, printf
, qui est utilisé en premier dans l'apprentissage, est également composé d'arguments de longueur variable, mais il est étonnamment difficile de créer une telle fonction.
Un fichier appelé stdargs.h
fournit des macros pour les arguments de longueur variable.
va_start
… Initialisation du pointeur d'argumentva_arg
… Récupère l'argumentva_end
... Nettoie le pointeur d'argumentLes caractéristiques de l'implémentation sont les suivantes.
va_start
. printf
" "(Si l'argument pointeur est suivi, NULL
à la fin` Il est nécessaire de décider de la valeur qui indique la fin de l'argument (comme l'insertion).JavaScript
Dans le cas de JavaScript jusqu'à ES5, il n'y a pas de notation spéciale étiquetée comme argument de longueur variable, mais elle correspond à l'argument de longueur variable lui-même car il n'y a pas de problème même si les nombres ne correspondent pas entre l'argument formel et l'argument réel. Je peux le faire.
Dans une fonction JavaScript, les arguments sont contenus dans un "objet de type tableau" appelé ʻarguments, et vous pouvez obtenir le nombre d'arguments avec ʻarguments.length
. De plus, quand il y a un argument formel, il y avait un comportement que l'élément «arguments» à la même position que l'argument formel est lié, mais il est aboli dans le mode strict de ES5.
Vous pouvez simplement tourner l'indice avec for
, ou si vous voulez le convertir en un tableau réel, vous pouvez le faire avec ʻArray.prototype.slice.call (arguments)`.
Si vous voulez convertir le contenu du tableau en une liste d'arguments, vous pouvez le faire avec function .apply (object to be this, array)
.
ES6
Dans ES6, il est possible de "recevoir des arguments de longueur variable sous forme de tableau" et de "développer et passer un tableau, etc. aux arguments" avec le même ...
(opérateur de propagation) que PHP. Notez que dans la fonction Flèche d'ES6 (notation de fonction utilisant =>
), ʻarguments` ** hérite également de ce qui est à l'extérieur ** ([MDN](https: //developer.mozilla. org / ja / docs / Web / JavaScript / Reference / arrow_functions)). Écrivons-le docilement avec l'opérateur de diffusion.
Ruby Ruby prend explicitement en charge les arguments de longueur variable et prend le nombre exact d'arguments. Lors de la déclaration d'un argument formel, s'il y a un argument préfixé par «*», il recevra les arguments restants sous forme de tableau (par nature, un seul peut être écrit dans la liste d'arguments).
Nombre d'arguments
def foo (arg1, *rest)
#Nécessite au moins un argument
end
def bar (*args)
#aucun problème
end
def baz (*args, last)
#Séparément*L'argument joint n'a pas besoin d'être le dernier
end
Si vous voulez développer un tableau et l'utiliser comme argument, vous pouvez le développer en écrivant comme method (* arr)
.
PHP Dans le cas de PHP, PHP 5.6 ou version ultérieure a la syntaxe «...», et comme «*» en Ruby, les arguments de longueur variable sont automatiquement emballés dans un tableau. Vous pouvez également ajouter des indications de type à cette liste d'arguments.
Même dans PHP 5.5 et les versions antérieures, la fonction peut recevoir plus d'arguments que d'arguments formels et peut être traitée par des fonctions telles que func_get_args
et func_num_args
.
Si vous voulez développer un tableau comme argument, vous pouvez utiliser ...
dans PHP 5.6 et versions ultérieures, et même avant cela, vous pouvez utiliser call_user_func_array
.
Recommended Posts