2010-05-14 62 views
14

有很多演員回覆給發件人的例子,但在瀏覽API文檔時,我注意到了!!和!?運營商是CanReply特性的一部分(似乎是2.8:http://www.scala-lang.org/archives/rc-api/scala/actors/CanReply.html的新功能)。因此,我想知道是否只是讓接收/反應塊返回一個值,即使PartialFunction返回類型而不是Unit?Scala actor如何返回一個值來響應消息?

我會從源頭上開始挖掘,試圖找出它們是如何使用的,但如果任何人有任何洞察力或知道更深入的文檔或示例,那麼我會非常感激。

乾杯, Paul。

回答

22

回覆可以與方法reply發送,如下所示:

import scala.actors._ 
class Reverser extends Actor { 
    def act() { Actor.loop { react { 
    case s: String => Thread.sleep(1000); reply(s.reverse) 
    case _ => exit() 
    }}} 
} 

有三種方式明確接受的答覆。

  • 使用!!,它返回一個Future,這是一個容器類,承諾在您需要時給你的內容。它會立即返回,但如果實際請求內容,則必須等到另一個線程完成並填充請求。
  • 使用!?沒有超時。只要其他線程回覆,您的代碼就會暫停。
  • 使用!?超時。您的代碼將會暫停,直到獲得答覆或超時過期,以先到者爲準。

下面是三個的例子:

val r = new Reverser 
r.start 
val a = (r !! "Hi") 
a() match { 
    case s: String => println(s) 
    case _ => println("Error A") 
} 
val b = r !? "Hello" 
b match { 
    case s: String => println(s) 
    case _ => println("Error B") 
} 
val c = (r !? (500,"Howdy")) 
c match { 
    case Some(s: String) => println(s) 
    case Some(_) => println("Error C") 
    case None => println("Too slow!") 
} 
r ! None // None isn't a string, so r will stop running 

而且,如果你運行你

iH 
elloH 
Too slow! 
+0

感謝您的!我也做了一些搜索自己,發現這個: http://java.dzone.com/articles/scala-threadless-concurrent 它的日期表明,運營商不是新的2.8,甚至如果CanReply特徵是。 – pdbartlett 2010-05-14 20:10:39

+1

@pdbartlett:沒錯。上面的代碼也可以在2.7中工作,除了'.reverse'不會在2.7中產生一個字符串,所以這個例子不會工作,除非你做'.reverse.toString'。但所有的演員/未來的東西工作得很好。 – 2010-05-14 20:52:21