2011-04-22 21 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