2012-08-22 39 views
1

我有一个斯卡拉演员的实现,基本上做平均。我推入维持总计和计数的条目并计算出平均值。发生了什么事情的时候,我在测试过程中以严密的循环运行这个测试,我错过了一个入口,我相信这是最后一个。 演员是这样的:斯卡拉演员和删除的条目

val actor = new Actor { def act = react { 
    case v: Long => addEntry(v); act 
    case _ =>() 
}}.start() 

编辑:addEntry的执行是这样的:

private def addEntry(v: Long) { 
    total = total + v 
    count = count + 1 
    avg = total/count 
    } 

和附加基本上是actor ! 10

后,我打电话停止测试,我等待大约200毫秒,以确保队列被处理。 (或者我认为这就是我在做什么,这是问题所在?)

编辑2:基本上,我现在认为,因为我在紧密循环中设置这些值,然后立即调用退出,最后一项或条目正在/未被处理或正在被丢弃。我把循环结束之间有一个小的睡眠(实际上这是一个CountDownLatch.await和actor.stop,现在我不能让测试失败。

+0

你可以显示'addEntry(v)'的实现以及如何将消息提交给actor? –

回答

0

你实现只只要你得到Long进入react否则停止。你可以用loop包起来,这相当于while (true),并添加匹配表达式停止actor来代替。因为Int被发送到演员,所以演员将停止actor ! 10将不匹配case v: Long => ...

val actor = new Actor { 
    def act() = { 
    loop { 
     react { 
     case "stop" => exit()  // you might create a messageobject instead 
     case l: Long => addEntry(l) 
     case i: Int => addEntry(i.toLong) 
     } 
    } 
    } 
}.start() 

这将是我的建议灰。

+0

如果你注意到,我从addEntry(long)中递归地调用,这与使用外部循环基本相同。另外,在我的实施中,我只关心long的。 – Alex

+0

是的,我注意到了,但这不是很好的做法。是的,你只关心Longs,但是你给Int发送了一个Int,所以我也想要覆盖这个案例。 –