2013年9月7日土曜日

[coffeescript]可変長引数

JavaScriptの場合、可変長引数みたいなことを実現しようとした場合、関数内でのみ使える配列っぽいargumentsオブジェクトを利用する必要がある。
このargumentsオブジェクトは、配列じゃないのでびみょーに使い勝手が悪かったりするんだよね。

そこで、coffeescriptを使ってあげると関数の引数名に「...」をつけてあげるだけで、いい感じに可変長引数を扱うことができます。

簡単な例を見てみましょう。

可変長引数を1つ受け取る関数

func = (params...) ->
  console.log params.join
  console.log params.join('-')

func 1, 2, 3

上記プログラムの実行結果。パラメータのparamsにはjoin関数が定義されていて、引数で指定した複数の値が、連結されているのがわかります。
[Function: join]
1-2-3

可変長引数とそれ以外の引数を受け取る関数

func = (params..., param2) ->
  console.log params.length
  console.log params.join('-')
  console.log "param2 = [#{param2}]"

func 1, 2, 3

上記プログラムを実行すると、最後に指定したパラメータが2番めの引数に、最後を除くパラメータが可変長引数に設定されていることがわかります。
2
1-2
param2 = [3]


コンパイルされたJavaScriptを見てみると

可変長引数を、配列のslice関数を使用して配列に変換しているようです。
(function() {
  var func,
    __slice = [].slice;

  func = function() {
    var params;
    params = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
    console.log(params.join);
    return console.log(params.join('-'));
  };

}).call(this);