2017-02-16 5 views
0

私はScalaでこれをしたいと思います。Scala: "insideから" Iteratorに値を渡す

def getFancyIterator: Iterator[Int] = { 
    ... { /// Some arbitrary logic goes here: conditionals, loops, whatever 
    ... { 
     ... { 
     val x = ... 
     // Then at some point I call this: 
     feedNext(x) 
     } 
    } 
    } 
} 

今、私は何ができるように、例えば、通常のイテレータのようになります。すべての外から:

getFancyIterator.foreach(println) 

もちろんのトリックは、私はすべて保存したくないということであり、任意の時点におけるコレクション内の値。言い換えれば、私のgetFancyIterator関数は、イテレータのnext()の値を "要求に応じて" "フィード"したいと思っています。

私はちょうどそれを行うには、いくつかの(あきれるほど)簡単な方法がなければならないと確信している、何とかそれは私の心に来ていません。..

UPDATE:本質的には 私がしたいですyield xを実行しますが、通常のforループからではなく、任意のコードから実行します。

+0

を。それは実際に何を返すのですか? –

+0

いいえ、関数全体が 'getFancyIterator'を返し、イテレータを返します。 'feedNext'は、結果のイテレータに次の値を「フィードする」場所をマークします。 –

+0

編集してくれてありがとう、Daniela –

答えて

0

だけで直接Iteratorインターフェイスを実装し、そしてあなたのfeedNext(x)値を返すためにnext()を使用: `feedNext`は`イテレータ[INT] `あなたは問題ないはずですが返された場合は

def getFancyIterator: Iterator[Int] = new Iterator[Int] { 
    def hasNext = true //or some other flag to determine when you are done. 
    def next():Int = { 
    //some fancy logic goes here to calculate x 
    1 
    } 
} 
+0

ええ、私はついにこのようなものに頼った。しかし私の元の考えはそれを後ろ向きにすることでした。私のファンシーロジックはxsを生成し、いくつかの特殊なメソッド 'feedNext'を使ってそれらを"フィード "します。そして、イテレータの外部ユーザはイテレータ上で 'next()'を呼び出すことによって必要なときにこれらの値をとります。しかし、私はこの考えを実現するのに成功しなかった。おそらく、非同期アクターの中には要求に応じてxsをメッセージとして送信するものもありますが、それは私の場合には複雑すぎます。 –

関連する問題