4

我是新来的斯卡拉。在学习Actor的时候,我尝试过扩展它以节省一行def:

import scala.actors.Actor
import Actor._
class Actoo(actoo: =>Unit) extends Actor {
    def act() {actoo}
}
object run extends Application {
    /* 
    // this one runs well
    val a = new Actor {
        def act() {
            receive { case 1 => println("1") }
        }
    }
    */
    val a = new Actoo {
        receive { case 1 => println("1") }
    }
    a.start
    a ! 1
}

然后异常跟踪如下所示:

java.lang.AssertionError: assertion failed: receive from channel belonging to other actor
    at scala.Predef$.assert(Predef.scala:92)
    at scala.actors.Actor$class.receive(Actor.scala:424)
    at Actoo.receive(actoo.scala:3)
    at run$$anon$1.<init>(actoo.scala:16)
    at run$.<init>(actoo.scala:15)
    at run$.<clinit>(actoo.scala)
    at run.main(actoo.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at scala.tools.nsc.ObjectRunner$$anonfun$run$1.apply(ObjectRunner.scala:75)
    at scala.tools.nsc.ObjectRunner$.withContextClassLoader(ObjectRunner.scala:49)
    at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:74)
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:154)
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

可能有许多替代方案可以做同样的事情,但我最好知道上面的代码不起作用的原因。

4

3 回答 3

8

这很容易。实际上,这种行为不是由于演员库。一段代码

val a = new Actoo {
        receive { case 1 => println("1") }
    }

被编译器解释为Actoo具有初始化主体的“创建新实例”receive {...}val actoo等于(). 因此,您的代码相当于

val a = new Actoo() {
        receive { case 1 => println("1") }
    }

为了修复代码,您需要编写

val a = new Actoo ({
        receive { case 1 => println("1") }
    })
于 2009-07-27T08:16:11.667 回答
5

单例中还有一种actor方法Actor可以满足您的需求。它甚至会自动呼叫start您。

import scala.actors.Actor
import Actor._

val a = actor {
  receive { case 1 => println("1") }
}

a ! 1
于 2009-07-28T03:22:25.513 回答
1

您实际上是在尝试从当前本机线程上的邮箱接收(本机线程也是 Actor)。

见证以下内容:

Welcome to Scala version 2.7.5.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_13).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import scala.actors.Actor._
import scala.actors.Actor._

scala> self ! 123

scala> receive { case x => println(x) }
123

现在,您想要完成的已经在库中(Actor.actor):

val a = actor {
  receive { case x => println(x) }
}
// no need to start a 
a ! 123

顺便说一句,扩展应用程序是一个非常糟糕的主意。改为使用def main(args: Array[String])

于 2009-07-27T08:23:03.447 回答