0

タイプ情報をscalaのどこに置くか、そしてどのように置くかを理解するのに問題があります。ここでは、sのシーケンスをいくつか作成し、Actorそれらを入力しません。たとえそうしなければならなかったとしてもmap、適切なタイプを与えるためにどのタイプのシーケンスが生成されるのかわかりません。

その後、Anysを合計しようとしているためにコンパイラが私に怒鳴ったとき、どこからギャップを埋め始めるのかわかりません。

これが私のコードです。必要な情報を利用できるようにしながら、コードを最小化しようとしました。

object Actors {
    def main(args: Array[String]) {
        val array = randomArray(5)
        val master = new Master(array, 5)
        master.start
    }

    def randomArray(length: Int): Array[Int] = {
        val generator = new Random
        new Array[Int](length) map((_:Int) => generator nextInt)
    }
}

class Master(array: Array[Int], slavesNumber: Int) extends Actor {
    def act () {
        val slaves = (1 to slavesNumber).map(_ => new Slave)
        slaves.foreach(s => s.start)
        val futures = slaves.map(s => s !! Work(array))
        val results = awaitAll(3000, futures:_*)
        val res2 = results.flatMap(x => x)
        println((0 /: res2)(_+_))
    }
}

class Slave() extends Actor {
    def act () {
        Actor.loop {
            receive {
                case Work(slice) =>
                    reply((slice :\ 0)(_+_))
            }
        }
    }
}

この問題に関する包括的なドキュメントへのいくつかの良い指針をいただければ幸いです。

4

1 に答える 1

2

アクター間で渡されるオブジェクトは入力されません。アクターで既に行っているように、Slaveアクターはオブジェクト自体をフィルター処理する必要があります。ご覧のとおり、!!は次のように定義されています

def !!(msg: Any): Future[Any]

したがって、返されるにはタイプ情報はありませんFuture。おそらく最も簡単な解決策は、行var res2 ..を次のように置き換えることです

val res2 = results collect {case Some(y:Int) => y}

これSomeにより、タイプの結果のみが除外されIntます。

于 2012-09-28T12:12:05.640 に答える