我是斯卡拉的新手.在学习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
}
Run Code Online (Sandbox Code Playgroud)
然后异常跟踪如下所示:
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)
Run Code Online (Sandbox Code Playgroud)
可能有许多替代方案可以做同样的事情,但我最好知道上面的代码不起作用的原因.
这很容易.事实上,这种行为不是由于actor库造成的.这段代码
val a = new Actoo {
receive { case 1 => println("1") }
}
Run Code Online (Sandbox Code Playgroud)
被编译器解释为Actoo"使用初始化主体创建新实例" receive {...}并val actoo变得相等().因此,您的代码相当于
val a = new Actoo() {
receive { case 1 => println("1") }
}
Run Code Online (Sandbox Code Playgroud)
为了修复代码,您需要编写
val a = new Actoo ({
receive { case 1 => println("1") }
})
Run Code Online (Sandbox Code Playgroud)
actor在Actor单身人士中还有一种方法可以满足你的需要.它甚至start会自动呼唤你.
import scala.actors.Actor
import Actor._
val a = actor {
receive { case 1 => println("1") }
}
a ! 1
Run Code Online (Sandbox Code Playgroud)