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プロパティ以外にも、以下の方法があります。
詳しくはAPIリファレンスの「for(マクロ)」の項を参照してください。