ObjectRangeクラス

【抜粋】
ObjectRange = Class.create();
Object.extend(ObjectRange.prototype, Enumerable);
Object.extend(ObjectRange.prototype, {
  initialize: function(start, end, exclusive) {
    this.start = start;
    this.end = end;
    this.exclusive = exclusive;
  },

  _each: function(iterator) {
    var value = this.start;
    do {
      iterator(value);
      value = value.succ();
    } while (this.include(value));
  },

  include: function(value) {
    if (value < this.start)
      return false;
    if (this.exclusive)
      return value < this.end;
    return value <= this.end;
  }
});

整数の数値範囲を表すオブジェクトです。

Class.create()でクラスを作成し、Enumerableクラスを継承後、initializeメソッドおよび他のメソッドを追加しています。

initializeメソッド

引数のstart,end,exclusiveをそれぞれ自オブジェクトのプロパティにセットします。exclusiveは範囲がendを含まない(未満)であればtrue、含む(以下)であればfalseを指定します。

_eachメソッド

継承したEnumerableクラスにおいて、抽象メソッド扱いになっているメソッドの実装です。startプロパティの値からインクリメント*1しながら、iteratorに渡して実行します。do while文なので一度は実行されます。値が自オブジェクトの表す範囲内であれば続行します。includeメソッドは次です。

includeメソッド

valueが自オブジェクトの表す範囲内であればtrue、でなければfalseを返却します。

【例】
var objR1 = new ObjectRange(-2, 3, true);
var objR2 = new ObjectRange(2, 5, false);
objR1.each(function(value){alert(value);});
//'-2','1','0','1','2'がそれぞれ表示される('3'は表示されない)
alert("next...");
objR2.each(function(value){alert(value);});
//'2','3','4','5'がそれぞれ表示される

*1:1ずつ増やす