PR

可変長引数の関数を定義する

 「引数の個数は、本来は実行環境がチェックすべきもので、プログラム側で意識しなければならないのはおかしい」と思う人がいるかもしれません。ただ、引数の扱いがゆるいおかげで、受け取る引数の個数が決まっていない「可変長引数」の関数も簡単に実装できます。

 可変長引数の関数の代表例がFunctionコンストラクタです。Functionコンストラクタの引数は、生成する関数オブジェクトの引数の個数によって変動します。引数の個数は関数によって異なるので、あらかじめ決めておくことはできないのです。

 可変長引数を利用することで、その時どきで引数の個数が異なるような処理を、柔軟に記述できます。リスト15は、与えられた引数の平均値を求めるaverage関数の例です。引数値をargumentsオブジェクトから読みこんでいきます。var_argsという仮引数には動作上の意味はありません。この関数が可変長引数であるという意図を関数の利用者に伝えるためのものです。

リスト15●可変長引数を利用して、与えられた引数の平均値を求めるaverage関数を実装
リスト15●可変長引数を利用して、与えられた引数の平均値を求めるaverage関数を実装
[画像のクリックで拡大表示]

 argumentsオブジェクトは配列ではありませんが、配列と同じような形で各要素にアクセスできます。ここでは、結果を表す変数resultに引数の値を順番に足しています(1)。最後に、引数の個数を表す変数lenの値で除算することで平均値を求めています(2)。average関数に渡す引数の個数にかかわらず、平均値を求められるのがわかります(3)。

 一部の引数だけを可変長にすることも可能です。リスト16は、第1引数のtypeに'sum'を指定した場合には以降の値の合計値、それ以外の場合には平均値を求めるaverageSum関数の例です。

リスト16●明示的に記述した引数と可変長引数を混在させる
リスト16●明示的に記述した引数と可変長引数を混在させる
[画像のクリックで拡大表示]