Enumerableクラス(4)

zipメソッド

【抜粋】
  zip: function() {
    var iterator = Prototype.K, args = $A(arguments);
    if (typeof args.last() == 'function')
      iterator = args.pop();

    var collections = [this].concat(args).map($A);
    return this.map(function(value, index) {
      iterator(value = collections.pluck(index));
      return value;
    });
  },

lastメソッドは後述「Arrayクラスへの拡張」で追加されるメソッドです。配列の最後の要素を返却します。引数の最後が関数であれば既存popメソッドで取得してiteratorとしています。そうでなければPrototype.Kをiteratorとします。

次に要素が自オブジェクトのみの配列([this])に、既存concatメソッドで引数を結合します。mapメソッドは前述collectメソッドの別名です(後述)。これと$A関数により、要素すべてをArrayオブジェクトに変換してcollectionsに格納しています。

あとはcollectionsの各要素について、同じインデックスの値を前述pluckメソッドで取り出し、これをiteratorで処理します。自オブジェクトの要素数分これを繰り返し、結果の配列を返却します。・・・が、ここでバグがあります。これだとiteratorの処理が反映されません。バージョン1.5.0_rc0では修正されているようです。

【参考】バージョン1.5.0_rc0のzipメソッド
  zip: function() {
    var iterator = Prototype.K, args = $A(arguments);
    if (typeof args.last() == 'function')
      iterator = args.pop();

    var collections = [this].concat(args).map($A);
    return this.map(function(value, index) {
      return iterator(collections.pluck(index));
    });
  },
【例】
var array = ["zero", "one", "two", "three"];
var ret = array.zip([0, 1, 2, 3], ["零", "壱", "弐", "参"],
function(value){ //v1.4.0では無効
  return value.map(function(value2){return "「" + value2 + "」"});
});
alert(ret[2]);
//ret[2]は配列。"two,2,弐"と表示される。
//v1.5.0_rc0 なら "「two」,「2」,「弐」"と表示される。

inspectメソッド

【抜粋】
  inspect: function() {
    return '#<Enumerable:' + this.toArray().inspect() + '>';
  }

thisを前述toArrayメソッドでArrayオブジェクトに変換し、Arrayクラスのinspectメソッドを呼び出しています。Arrayクラスのinspectメソッドは、配列を「[]」でくくり、各要素を「,」で区切った文字列を返却します。ArrayクラスとHashクラスはinspectメソッドをオーバーライドしていますので、それ以外のクラス・オブジェクトで利用されます。

直接使用されるのではなく、Object.inspectメソッド経由の利用を想定しているようです。

【例】
var objR = $R(0, 5, true);
alert(Object.inspect(objR));
//"#<Enumerable:[0, 1, 2, 3, 4]>"と表示される。