[英]scala syntax understanding about loop and receive in actor
我注意到编写此scala
代码是合法的:
val fussyActor = actor {
loop {
receive {
case s: String => println("I got a String: " + s)
case _ => println("I have no idea what I just got.")
}
}
}
我从文档中知道actor
是一个特征,它具有loop
并receive
值成员。 但是如何像上面那样堆叠这些方法呢? 它是实现还是覆盖了这些方法? 我对这种语法很困惑。 请提供一些良好的参考/指针。
首先,是标准的免责声明。 不推荐使用Scala演员,而推荐使用Akka演员。 如果您想继续学习将Actor与Scala结合使用的方法,则应该研究Akka而不是研究Scala Actors。
现在,关于您的问题。 这里有很多事情在做,所以让我们首先从定义新的Scala Actor所需要做的事情开始。 如果查看Scala Actor特性,您会发现必须提供一种抽象方法,称为act():Unit
。 此方法不接受任何输入,也不返回任何输入。 它定义了演员的行为。 因此,以最简单的形式,自定义Scala Actor可以是:
class MyActor extends Actor{
def act(){
}
}
现在,这不是一个非常有趣的演员,因为它什么也不做。 现在,提供行为的一种方法是调用receive
方法,提供PartialFunction[Any,R]
,其中R是通用返回类型。 您可以这样做:
class MyActor extends Actor{
def act(){
receive{
case "foo" => println("bar")
}
}
}
因此,现在,如果此参与者收到消息“ foo”,它将打印“ bar”。 这里的问题是,这只会在第一个消息发生,然后在之后将不做任何事情。 要解决这个问题。 我们可以将我们的调用包装为具有loop
调用的receive
,以使其继续为receive
的每条消息执行提供的receive
调用:
class MyActor extends Actor{
def act(){
loop{
receive{
case "foo" => println("bar")
}
}
}
}
因此,现在开始看起来像您的示例。 我们利用loop
并receive
Actor
特性附带的方法来赋予此actor行为。 最后,我可以使用Actor
随播对象上的actor
方法动态定义一个类,而不是将其定义为我的actor。 该方法采用一个函数体,该函数体将用作如下所示的act
:
def actor(body: => Unit){
val a = new Actor {
def act() = body
override final val scheduler: IScheduler = parentScheduler
}
}
因此,在您的示例中,您正在动态创建一个新的actor实现,并为该act
提供了一个impl,它将使用您提供的用于消息处理的部分函数连续循环和调用receive
。
希望这可以澄清一些事情。 您要“覆盖”(为其提供隐含)的唯一方法是act
。 当您看到loop
和receive
,这些不是覆盖。 它们只是调用Actor
特性上的现有方法。
实际上,如果没有import Actor._
这是非法的。
您没有导入的代码:
val fussyActor = Actor.actor {
Actor.loop {
Actor.receive { ... }
}
}
actor
, loop
和receive
是对象Actor
方法。
def actor(body: ⇒ Unit): Actor
def loop(body: ⇒ Unit): Unit
def receive[A](f: PartialFunction[Any, A]): A
方法actor
接受by-name
Untit
参数body
-一些代码块以在单独的线程中执行,并创建具有使用参数body
实现的act
方法的Actor
。
方法loop
接受by-name
Untit
参数body
-一些代码块在无限循环中执行。
方法receive
接受PartialFunction
作为参数f
并以消息作为参数调用f
。 它从与当前线程关联的actor获取消息。
请注意,scala actor已过时,您应该使用akka actor。 请参阅《 Scala Actor迁移指南》 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.