我认为处理队列是最常见的情况。我将读取队列的开头,对元素进行操作(这可能导致将更多元素添加到队列中),然后循环直到队列为空。
foreach
,但是没有,显然一个队列(甚至是一个可变的队列)是严格的,并且在迭代开始时foreach循环遍历队列中的所有元素。 while
循环的语法。 您可能会以为
while (!q.isEmpty) {
var (e, q) = q.dequeue
... }
除了我要重新声明
q
之外,将可以使用。这确实有效:while (!q.isEmpty) {
var (e, q1) = q.dequeue
q = q1
... }
但是男人,这看起来不对吗...
最佳答案
这是一种完全避免使用任何var的方法:
val q0 = collection.immutable.Queue("1","Two","iii")
Iterator.iterate(q0) { qi =>
val (e,q) = qi.dequeue
println("I just dequeued "+e) // Your side-effecting operations go here
if (e.length!=2) q.enqueue("..") // Your changes to the queue go here
else q
}.takeWhile(! _.isEmpty).foreach(identity)
首先从初始队列
q0
开始,然后在qi
步骤中,使某些内容出队并生成新队列(如果需要),然后将其返回下一步。剩下的就是停止条件(不为空),然后由于这仅定义了一个过程,而不是实际的 Action ,因此您必须运行它(例如,使用无操作foreach)。