-1

我对这种叫做 Scala 的花哨语言很陌生。

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

2 和 4 是我希望我的演员进行计算的数组中的索引,而 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
  }
}

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

4

1 回答 1

1

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

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

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

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

Whentrial只是一个可赋值变量,它可以匹配任何东西,所以第一种情况总是会成功......对于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")
于 2012-09-05T04:34:23.133 回答