2

我正在使用 scala 2.10 和 Akka 2.2.1 在 ubuntu 12.04 下开发 eclipse。

        // A and B are derived from Node
        val algorithm = if(args(0) > 1)()=> new A else ()=> new B      

       /* alternative: 
        val algorithm = if(args(0) > 1) (()=> system.actorOf(Props(new A), name ="A") )
                        else (()=> system.actorOf(Props(new B),name="B"))
       */       
        // alternative : class work(algorithm: ()=>ActorRef, num:Int) {    
        class work(algorithm: ()=> Node, num: Int){

           val a = Array.fill(num)(algorithm) // here I wanna create an array with num slots 
                                                // and objects of A or B in it
           val rand = new Random(System.currentTimeMillis())
           val randomNode = a(rand.nextInt(5))
           def find (x:Int): Array[ActorRef]{....}
           def receive = {        
              case Rumor => 
            a.foreach(ref=> ref !Init(index, find(x), self))
                randomNode ! Rumor
              case _ => println(...)        
           }    
        }

更新:

我创建了一个包含 Actor 或 ActorRef 的数组(我不确定我可以在 Akka 中使用哪一个)。但日食报告

case Rumor => 
   a.foreach(ref=> ref !Init(index, find(x), self))
   randomNode ! Rumor

我尝试了几次,但它仍然不起作用。

4

2 回答 2

5

Array 构造函数只接受长度值,而不接受默认值函数。您引用的帖子解释了如何构建一个接受默认值生成器的自定义数据结构。

你在做什么相当于

val arr = new Array[Node](num)
val a = arr(algorithm)

所以 scala 需要一个整数索引。它抱怨它找不到转换()=>Node为整数以访问数组中的索引的方法。

要使用默认值填充数组,您可以像这样使用Array.fill

val a = Array.fill(num)(algorithm)
于 2013-10-02T02:31:54.400 回答
1

创建actor数组的正确方法应该是:

val algorithm = if(args(0) > 1) ()=>context.actorOf(Props(new A))  
                else ()=>context.actorOf(Props(new B))  
val a = Array.fill(num)(algorithm())
于 2013-10-02T23:12:29.470 回答