私はscalaの初心者で、ペストリープロトコルを実装するためのscalaコードを書いています。プロトコル自体は問題ではありません。ノードがあり、各ノードには入力したいルーティング テーブルがあります。コードの一部は次のとおりです。
def act () {
def getMatchingNode (initialMatch :String) : Int = {
val len = initialMatch.length
for (i <- 0 to noOfNodes-1) {
var flag : Int = 1
for (j <- 0 to len-1) {
if (list(i).key.charAt(j) == initialMatch(j)) {
continue
}
else {
flag = 0
}
}
if (flag == 1) {
return i
}
}
return -1
}
// iterate over rows
for (ii <- 0 to rows - 1) {
for (jj <- 0 to 15) {
var initialMatch = ""
for (k <- 0 to ii-1) {
initialMatch = initialMatch + key.charAt(k)
}
initialMatch += jj
println("initialMatch",initialMatch)
if (getMatchingNode(initialMatch) != -1) {
Routing(0)(jj) = list(getMatchingNode(initialMatch)).key
}
else {
Routing(0)(jj) = "NULL"
}
}
}
}// act
問題は、getMatchingNode への関数呼び出しが行われると、アクターが勝手に死んでしまうことです。「リスト」はすべてのノードのリストです。(ノード オブジェクトのリスト) また、この動作には一貫性がありません。getMatchingNode の呼び出しは、各アクター (10 ノード) に対して 15 回行う必要があります。しかし、デバッグ中に、アクターは getMatchingNode 関数を 1 回呼び出した後、または 3 ~ 4 回呼び出した後に自分自身を殺します。実行される scala ライブラリ コードは次のとおりです。
def run() {
try {
beginExecution()
try {
if (fun eq null)
handler(msg)
else
fun()
} catch {
case _: KillActorControl =>
// do nothing
case e: Exception if reactor.exceptionHandler.isDefinedAt(e) =>
reactor.exceptionHandler(e)
}
reactor.kill()
}
Eclipse は、このコードが getMatchingNode 関数の for ループから呼び出されたことを示しています。
def getMatchingNode (initialMatch :String) : Int = {
val len = initialMatch.length
for (i <- 0 to noOfNodes-1)
奇妙なことに、ループが正常に動作する場合もあれば、アクターを殺す scala コードに移動する場合もあります。
コードの何が問題なのですか??
どんな助けでも大歓迎です。