[英]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.