MochiKitのiterrable-objectにhasNext()っぽいメソッドが無い件
from __future__ import * » Iteration in JavaScriptのコメント欄で繰り広げられているようなiterableオブジェクトにnext()意外のメソッド欲しい問題に直面しました。
perlのClass::DBIのfind_or_create()っぽいメソッド実装していて、iterableを返すisearch()なるメソッド呼び出して要素が帰ってこなかったらinsert()しようとしていたのですが、isearch()でiterable-object返しているとそのオブジェクトではnext()しか出来ないからとりあえず取り出せるか試して例外キャッチしてStopIterationならinsert()するというダサイコードになってしまいます。
'find_or_create' : function( data ) { ... var results = self.isearch( ... ); try { return results.next(); } catch (e) { if ( e != StopIteration ) { log( ' foc unknown exception' ); throw e; } else { log( ' foc not found!' ); return self.insert( data ); } } },
hasNext()があれば戻り値の決定は以下のように出来ますが、
if ( results.hasNext() ) { return results.next(); } else { return insert( data ); }
無いので一旦list化して以下のような感じで実装してみました。
results = list( results ); if ( results.length > 0 ) { return results[0]; } else { log( ' foc not found!' ); return this.insert( data ); }
これはこれでlist化ステップが無駄な感じです。MochiKit.Iterの実装理解してbind( hasNext, MochiKit.Iter )のほうがスマートかも。あるいはisearchなのが駄目なのか。いずれにしてもiteratorから要素取得出来なかった場合に正常系の他の動作をさせたいときは、現状は小細工が必要そうです。