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



我是这种叫做Scala的奇特语言的新手。

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

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
  }
}

与其说是传递元组的问题,不如说这是一个奇怪的问题(可能是语法(,即接收中有多个案例。

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

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

我们可以在一个简单的例子中看到"赋值"行为:

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

trial只是一个可赋值的变量时,它可以匹配任何东西,所以第一种情况总是会成功......对于trialadd对象。 由于第一种情况始终成功,因此您会收到一条错误消息,告诉您第二种情况无法访问。

要解决此问题,您需要使用"稳定标识符"。 稳定标识符包含在反引号中:

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")

最新更新