scala - 扩展 Scala Actor

标签 scala actor

我是 Scala 的新手。在学习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)

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

最佳答案

这很容易。事实上,这种行为不是由于 Actor 库造成的。一段代码

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

关于scala - 扩展 Scala Actor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1186523/

相关文章:

scala - 当客户端 actor 与远程 actor 断开连接时如何禁用 Akka 错误消息?

scala - 基于原点的约束函数(路径依赖类型?类型生成?)

scala - 在 sbt 中,如何在所有配置中覆盖控制台的 scalacOptions?

scala - 使用 Scala 进行 Akka actors 单元测试

scala - 将消息发送到Scala中的函数

scala - Akka - 使用反射创建 Actor

scala - 使用 Scala 在 Flink 中从 JDBC 源创建数据集

scala - 从 sbt 运行 Play 项目

scala - 来自类型安全配置的案例类实例化

sprite - Sprite 和 Actor 之间的libgdx区别