Play2.0フレームワークを学び始めたところです。私が理解できないことの1つは、プレイチュートリアルで説明されているIteratee、Enumerator、およびEnumerateeのパターンです。関数型言語の経験はほとんどありません。
このパターンは何を達成しますか?
非ブロッキング/リアクティブコードを書くのにどのように役立ちますか?
いくつかの簡単な例が役立ちます。
Play2.0フレームワークを学び始めたところです。私が理解できないことの1つは、プレイチュートリアルで説明されているIteratee、Enumerator、およびEnumerateeのパターンです。関数型言語の経験はほとんどありません。
このパターンは何を達成しますか?
非ブロッキング/リアクティブコードを書くのにどのように役立ちますか?
いくつかの簡単な例が役立ちます。
playframework 2.0のダウンロードには、いくつかのサンプルが付属しています。そのうちの2つにはIteratee/Cometの例があります。たとえば、彗星時計のサンプルアプリは次のように表示されます。
lazy val clock = Enumerator.fromCallback { () =>
Promise.timeout(Some(dateFormat.format(new Date)), 100 milliseconds)
}
次に、次のように使用されます。
Ok.stream(clock &> Comet(callback = "parent.clockChanged"))
結果をチャンクでクライアントにフィードします。Enumerator
オブジェクトにはfromFile
、fromStream
(のように)java.io.InputStream
ユーティリティ列挙関数もあります。
これがどこで行われるかはわかりませんが、このチャンク処理がスレッドを拘束していないことを前提としています。処理されるデータと計算がさまざまなオブジェクトにラップされるため、反復の実装には確かにオーバーヘッドがあるため、いくつかのベンチマークを確認することは非常に興味深いでしょう。
列挙子から供給されるデータは、処理するデータがまだあるか、データが終わり(EOF)に達したことを示すことができるようにラップされます。反復の処理結果もラップされるため、結果が何らかの入力で計算されたか、結果を計算するためにより多くの入力が必要かを示すことができます。褶曲から反復への進化を示すジョン・デ・ゴーズのネスカラプレゼンテーションをお勧めします。編集:Brendan McAdamsは、非同期とノンブロッキングに関する素晴らしいScala Days 2012プレゼンテーションを公開しています-プレゼンテーションの終わり(〜26分)に向けて、反復と、非同期スタイルでのデータベースカーソルスタイルIOの処理にどのように役立つかについて説明します。
宣伝されている利点の1つIteratees
は、それらが構成することです。それらが構成するいくつかの方法は次のとおりです。
(T) => U
T
U