2010/08/12

値を列挙するジェネレータの使い方

NILScriptが提供するクラスには、SpiderMonkey1.7で追加された「ジェネレータ」というオブジェクトを返すプロパティやメソッドが数多く存在します。
ジェネレータとは、値を順に出力するオブジェクトです。

値を配列として返す場合と違い、最初に全ての要素を生成する必要がないので、値が列挙されるごとに画面表示を行って体感速度を向上させられたり出来ます。
また、条件に一致する値を一つだけ検索する場合などに、要素が見つかった時点で値の列挙を打ち切ることも出来ます。

ジェネレータは、通常は下記のようにのようにfor...in文で使用します。

for(let p in Process.all){
 if(p.name=='ng.exe'){
  println(p.commandline);
 }
}

この例では、「Process.all」というプロパティで取得できるジェネレータが列挙するProcessオブジェクトをそれぞれ「p」という変数に代入して「{}」内の処理を実行します。
実行してみると、「ng.exe」で実行中のプロセスのコマンドラインが表示されるはずです。

しかし、NILScriptで用意されているジェネレータの拡張メソッドを使うと、ループを使用せずに様々な反復処理を効率よく記述できる場合があります。
例えば、前述の例は、拡張メソッドを使うと以下のように記述できます。

Process.all.filter('name','ng.exe').map('commandline').execute(println);

ここでは、最終的にグローバルに定義済みのprintln関数に渡されていますが、「execute(function(){})」のようにして任意の処理を実行させることも可能です。

なお、ジェネレータではなく配列が必要な場合などは「Process.all.toArray()」のようにすると、配列に変換できます。
また、逆に配列などをジェネレータに変換する「$G()」という関数も用意されています。

ジェネレータには、他にも多数の拡張メソッドが定義されており、同梱の「doc\base_stdex.txt」で説明されています。
全てを使いこなす必要はありませんが、filter()やmap()、execute()、toArray()などは、覚えておくと役に立つでしょう。

0 件のコメント:

コメントを投稿