可変長引数
Variable length arguments
引数の数が不定であること。
sum(a1, a2, ..., an) のように引数の数を固定にしない方がよいケースがある。
C言語の printf(format, ...) のように、書式に対して埋め込みする引数を任意の数にしたいケースがある。
JavaScript
宣言時の引数は、関数が呼び出された時に自動的に代入するための変数の明示でしかない。
呼び出されたときの引数の数が多くても少なくてもエラーにはならない。(TypeScript では許されない。)
引数はすべて arguments プロパティに含まれる。(時代遅れ) arguments は配列に似ているが、配列ではない。
このため、配列化してから扱うのがセオリーになっている。
var args = Array.from(arguments);
アロー関数では arguments は非対応になった。その代わり、不定長引数を受け取るパラメータの指定をスプレッド構文で行うようになった。
例
code:variable_argument.js
(a, b, ...args) => { /*...*/ }
...+変数名で、変数名の変数が不定長引数を配列として受け取る。
名前付きの可変長引数が欲しいようなケースでは、object を渡す仕組みにする。
C言語
C言語の仕様上、引数に渡された型が不明であること、型ごとにデータサイズがあることから、型を指定しながら次の要素を指定していくようなAPIになっている。
code:va.c
以前は varargs.h ヘッダだった。標準化により stdarg.h に変わった。
printf の実装が任意の型を受け取る使い方の 惨状 例として挙げられる。
C#
関数宣言時に、引数の配列に params 属性を付けると、それが可変長引数の指定となる。