在Scala Actor模型中使用接收调用中的多个案例

时间:2012-09-05 04:28:07

标签: scala actor

我是这种名为Scala的奇特语言的新手。

我在C ++中有足够的(我猜)编程经验。 作为编程练习,我试图使用Scala的Actor模型来添加数组的元素。我创建了一个名为workerActor的类。 在我的main方法中,我创建了这个类的对象,然后尝试向这个对象发送消息(当我从Scala中的Actor类扩展我的类时,这是一个actor)。 当我将一个字符串传递给actor时,act方法中的代码被执行,逻辑进入正确的情况,每个人都很高兴。 但是,当我尝试将元组传递给对象时 样品! (2,4,ARR)

2和4是数组中的索引,我希望我的actor进行计算,而arr是我要传递的数组,它显示错误。 如何将数组和索引传递给我的数组到Actor。 Scala是否允许将元组传递给演员?

作为一个有趣的观察,我意识到如果我在act()方法中有第二个案例,我会收到编译错误。 Eclipse向我展示了无法访问的代码。 知道为什么我不能在接收方法中使用第二种情况可能是什么问题。

case object add
case object trial

import scala.actors._
import Actor._

class workerActor(arr: Array[Int]) extends Actor{
def addarr(a: Int, b: Int): Int = {
var sum = 0
for (i <- a to b)
  sum += arr(i)
  println("Sum :",a,b,sum)
sum
}
def act(){
   receive {
   case trial => println("Received trial")
   //case trial => println("Received add") //uncommenting this line does not compile the program
   }
}
}

object hello {
  def main(args: Array[String]): Unit = {
    println("Hello World")
    val arr = Array(1,2,3,4,5,7,13,4,6,6,23);
    val sample = new workerActor(arr)
    val s = sample.addarr(2, 4,arr)
    sample ! (2,4)
    sample ! "try"
    sample ! add
    sample.start   
    sample ! trial
  }
}

而不是传递元组的问题,这看起来是一个奇怪的问题(可能是语法)在接收中有多个案例。

1 个答案:

答案 0 :(得分:1)

问题在于,在一个case语句中,Scala将以小写字母开头的标识符视为变量,因此实际上它正在分配一个名为&#34; trial&#34;在第一种情况下:

case trial => println("Received trial")
case add   => println("Received add")

我们可以看到&#34;任务&#34;行为举一个简单的例子:

scala> 5 match { case something => println("matched " + something) }
matched 5

trial只是一个可赋值变量时,它可以匹配任何内容,因此对于trialadd对象,第一种情况总是会成功。由于第一种情况总是成功,因此会出现错误,告诉您第二种情况无法访问。

要解决此问题,您需要使用&#34;稳定标识符&#34;。反引号中包含稳定的标识符:

case `trial` => println("Received trial")
case `add`   => println("Received add")

或以大写字母开头:

case object Add
case object Trial

...

case Trial => println("Received trial")
case Add   => println("Received add")