2012-05-09 56 views
1

我正在试验斯卡拉演员。但我对两件事情非常好奇。 (1)有没有办法将一个actor声明为自己的一个参数(如下面的代码)而不使用另一个actor? (我见过生产者/消费者的例子和许多其他的声明一种类型的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) 
    } 
} 

回答

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> 

如果你想它存储到一个变量,后来与一个演员的实际实例调用它,你会得到一个实例你的Actor1类。