我正在Scala中尝试演员。但我对两件事非常好奇。 (1)有没有办法在不使用其他actor的情况下将actor声明为自身的参数(如下面的代码所示)? (我已经看过Producer / Consumer示例和许多其他人,它们声明了一种类型的actor并将其作为另一种参数使用。)另外,(2)main方法中声明一个新actor的语句,但使用" _:演员" ... 那是什么意思?它编译(我没有预料到)但是没有像我预期的那样工作(我预期)。
import scala.actors.Actor;
import Actor._;
// Code for declaring methods that actors can send and receive
class Actor1(subact: Actor) extends Actor {
def act: Unit = {
println("doing stuff...")
while (true) {
// Code here for methods ...
}
}
this.start()
}
object foo {
def main(args: Array[String]) : Unit = {
val i = new Actor1(_ : Actor)
}
}
答案 0 :(得分:3)
(1)
是的,这是可能的:
class Foo(actor: => Actor) extends Actor {
def act {
loop {
react {
case x: String => actor ! x
}
}
}
}
lazy val foo = new Foo(foo)
foo.start
foo ! "bar"
但它没有多大意义,因为你总是在其内部引用演员;-)。在这种情况下,它就像一个无限循环。
(2)非常简单,你创建了一个部分应用的函数:
scala> class Foo(actor: Actor) {
| println(actor.toString)
| }
defined class Foo
scala> new Foo(_: Actor)
res0: (scala.actors.Actor) => Foo = <function1>
如果你将它存储到一个变量中,然后用一个Actor的实际实例调用它,你将获得一个Actor1类的实例。