簡體   English   中英

Scala語法了解actor中的循環和接收

[英]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是一個特征,它具有loopreceive值成員。 但是如何像上面那樣堆疊這些方法呢? 它是實現還是覆蓋了這些方法? 我對這種語法很困惑。 請提供一些良好的參考/指針。

首先,是標准的免責聲明。 不推薦使用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")
      }
    }
  }
}

因此,現在開始看起來像您的示例。 我們利用loopreceive 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 當您看到loopreceive ,這些不是覆蓋。 它們只是調用Actor特性上的現有方法。

實際上,如果沒有import Actor._這是非法的。

您沒有導入的代碼:

val fussyActor = Actor.actor {
  Actor.loop {
    Actor.receive { ... }
  }
}

actorloopreceive是對象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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM