2011-04-22 54 views
1

非演員類發送一個同步消息,演員是這樣的:如何發送斯卡拉演員內延遲響應

 

val response = WorkData !? "hello" 
 

如果我要響應此消息馬上,比我會做到這一點:

 

receive { 
    case "hello" => reply("world") 
} 
 

但是,如果我需要回答一些在未來的時間,比 我如何存儲調用參考,併發送後的回答嗎?

+1

如果你想在未來的答覆,我認爲,你需要發送異步消息(不是同步一個以'?!'),併爲您的演員最簡單的方法在準備就緒時交出回覆時,發件人本身也是演員。 – 2011-04-22 14:07:15

+0

不幸的是,我需要大量的重構,才能讓發件人成爲演員。我認爲我可以以某種方式獲得發件人的「未來」參考,並使用它發回答案。 – Michael 2011-04-22 17:14:03

回答

4

對當前呼叫者的引用存儲在sender。例如,它是完全有效的與

receive { 
    case "hello" => sender ! "world" 
} 

更換

receive { 
    case "hello" => reply("world") 
} 

可以將此參考以下存儲在可變的變量,或通過演員的循環遞歸通過。

+0

發件人不是演員,我想我不能通過發件人發回消息嗎?或者我錯了嗎? – Michael 2011-04-22 17:11:33

+0

您可以發送消息回Scala 2.8中的非演員 – Jus12 2011-04-23 00:55:23

4

我通常會存儲發件人引用以便稍後使用它。

receive { 
    case "hello" => 
    val otherParty = sender 
    // more receives, etc 
    // ... 
    otherParty ! "world" 
} 
+0

希望我早些時候見過。謝謝! – pigate 2016-03-21 20:40:24

1

只是產生一個匿名演員來處理消息並在準備好時做出響應呢?這樣接收器就可以充當調度員。這不需要一個可變變量來存儲任何東西,因爲你在這裏使用閉包。

import scala.actors.Actor                
import scala.actors.Actor._ 

case class Message(msg: String) 

class MyReceiver extends Actor { 
    def act() { 
    react { 
     case Message(msg) => 
     actor { 
      sender ! process(msg) 
     } 
    } 
    } 

    def process(msg: String): String = 
    "Result: " + msg 
} 

object Main { 
    def main(args: Array[String]) { 
    val a = new MyReceiver 
    a.start() 

    val res = a !? Message("foo") 
    println(res) 
    } 
} 

問候,raichoo