predがtrueを返す要素だけをイテレートするイテレータを返します。
selectとfilterは全く同じ動作です。
ゲームのオブジェクトの更新・削除を意識したサンプルです。イテレータはfiberを使って実現されているので、もちろんfor文で書いた方が速いです。
class Object{ + _isAlive : false; _i; initialize(_i){} update(){ if (math::random() < 0.5){ %f[Object %d is finished.](_i).p; return false; } return true; } release(){ _isAlive = false; %f[Object %d is released.](_i).p; } } objs : []; 10.times{ obj : Object(it); obj.isAlive = true; objs.push_back(obj); } objs.filter(|obj| obj.isAlive?(!obj.update()):false){ it.release(); } objs{ it.isAlive.p; }
Object 0 is finished. Object 0 is released. Object 1 is finished. Object 1 is released. Object 3 is finished. Object 3 is released. Object 5 is finished. Object 5 is released. Object 6 is finished. Object 6 is released. false false true false true false false true true true