我是这种名为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
}
}
而不是传递元组的问题,这看起来是一个奇怪的问题(可能是语法)在接收中有多个案例。
答案 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
只是一个可赋值变量时,它可以匹配任何内容,因此对于trial
和add
对象,第一种情况总是会成功。由于第一种情况总是成功,因此会出现错误,告诉您第二种情况无法访问。
要解决此问题,您需要使用&#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")