26

Play2.0フレームワークを学び始めたところです。私が理解できないことの1つは、プレイチュートリアルで説明されているIteratee、Enumerator、およびEnumerateeのパターンです。関数型言語の経験はほとんどありません。

このパターンは何を達成しますか?

非ブロッキング/リアクティブコードを書くのにどのように役立ちますか?

いくつかの簡単な例が役立ちます。

4

1 に答える 1

19

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オブジェクトにはfromFilefromStream(のように)java.io.InputStreamユーティリティ列挙関数もあります。

これがどこで行われるかはわかりませんが、このチャンク処理がスレッドを拘束していないことを前提としています。処理されるデータと計算がさまざまなオブジェクトにラップされるため、反復の実装には確かにオーバーヘッドがあるため、いくつかのベンチマークを確認することは非常に興味深いでしょう。

列挙子から供給されるデータは、処理するデータがまだあるか、データが終わり(EOF)に達したことを示すことができるようにラップされます。反復の処理結果もラップされるため、結果が何らかの入力で計算されたか、結果を計算するためにより多くの入力が必要かを示すことができます。褶曲から反復への進化を示すジョン・デ・ゴーズのネスカラプレゼンテーションをお勧めします。編集:Brendan McAdamsは、非同期とノンブロッキングに関する素晴らしいScala Days 2012プレゼンテーションを公開しています-プレゼンテーションの終わり(〜26分)に向けて、反復と、非同期スタイルでのデータベースカーソルスタイルIOの処理にどのように役立つかについて説明します。

宣伝されている利点の1つIterateesは、それらが構成することです。それらが構成するいくつかの方法は次のとおりです。

  • 列挙子にフィードしてから別の
  • タイプの関数をの列挙子にマップして、の列挙子を取得できます。(T) => UTU
  • 2つの列挙子をインターリーブできます
  • iterateeは、別のiterateeによって消費される入力を残すことができます
于 2012-04-17T01:44:45.070 に答える