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]>"と表示される。