forで回せる自作クラス

id:giuseppe:20070408では、for文のコンテナループの使い方を紹介しました。

あるルールに従うことで、自分で定義したクラスについてもfor文で回せるようになります。


例えば、FooListクラスのオブジェクトが、内部にFooItemクラスのオブジェクトを複数保持しているとします。

{define-class FooItem}

{define-class FooList
  field items:{Array-of FooItem} = {new {Array-of FooItem}}
}

このようなとき、FooListクラスに "get" という名前のメソッドと "for-loop-count" という名前のプロパティを適切に定義してやることで、for文で回せるクラスが出来上がります。

{define-class FooList
  {method {get i:int}:FooItem
    {return self.items[i]}
  }
  {getter {for-loop-count}:int
    {return self.items.size}
  }

getメソッドはひとつのint型引数を受け取り、FooItemを返します。一方、for-loop-countゲッターでは取得できるFooItemの数を返すようにします。
以上でFooListはfor文のコンテナオブジェクトとして扱うことができます。

let foo:FooList = {FooList}
||...
{for item:FooItem key i:int in foo do
    {do-something-with item}
}


forで回せるクラスを定義するためには、getメソッド/for-loop-countプロパティ以外にも、以下の方法があります。

  • to-Iteratorメソッドを実装する
  • getメソッド/keys-to-Iteratorメソッドを実装する

詳しくはAPIリファレンスの「for(マクロ)」の項を参照してください。