我目前正在研究一种与 Scala 一起使用的日志记录机制,但我遇到了一个意外问题,阻止了我实际研究它。为了测试功能,我希望设置一个简单的消息传递环。在环内,每个节点都是 Scala Actor 的扩展,并且知道它的直接邻居(上一个/下一个)。
环构造如下完成,参数“nodes”从控制器参与者传递:
def buildRing(nodes:Array[Actor]){
var spliceArr:Array[Actor] = new Array[Actor](2)
spliceArr(0) = nodes(nodes.length-1)
spliceArr(1) = nodes(1)
nodes(0) ! spliceArr
Thread.sleep(100)
spliceArr(0) = nodes(nodes.length-2)
spliceArr(1) = nodes(0)
nodes(nodes.length-1) ! spliceArr
Thread.sleep(100)
for(i <-1 to numNodes-2){
spliceArr(0) = nodes(i-1)
spliceArr(1) = nodes(i+1)
nodes(i) ! spliceArr
Thread.sleep(100)
}
}
这似乎可以按我的意愿运行,每个节点都接收到正确的邻居对。在节点类中有一个大小为 2 的数组,设置如下:
class node(locLogger:logger,nid:Int,boss:Actor) extends Actor{
val ringNeighbors:Array[Actor] = new Array[Actor](2)
def act{
locLogger.start
loop{
receive{
case n:Array[Actor] =>
ringNeighbors(0) = n(0)
ringNeighbors(1) = n(1)
一切都很好,但是,当我引入要在环周围传递的消息时(从节点 0 开始),我发现每个节点现在在它的 ringNeighbors 数组中都有相同的值。这些值与 ringBuilder(即节点 8 的邻居)函数中循环的最终迭代一致。没有发生额外的消息传递,所以我不明白这些值是如何为节点数组中的每个实例修改的,因此是环。
我仍在学习 Scala 的基本知识,希望我没有错误地忽略一些简单的事情。