2015-09-07 52 views
0

我在學習Scala和我偶然發現了模式匹配的問題: 我想將一段代碼傳遞給akka.actor,以便演員可以執行它,它只是一個教程所以我沒有的,我想使用它的一個明顯的例子,反正什麼,我試圖做看起來是這樣的:模式匹配在Scala中的代碼塊

override def receive: Receive = { 
    case (block: => Unit) => block 
    case _ => println("cant work with that") 
} 

不幸的是這不會工作。我希望你們知道我想要做什麼。

EDIT_1

我發現,如果我只是模式匹配Any,它會工作,但因爲我現在Any匹配,這是非常不準確,也危險:

override def receive: Receive = { 
    case block => block 
    case _ => println("cant work with that") 
} 

你看通過代碼塊現在匹配並執行,但塊匹配Any事情,所以這仍然不是我想要的

+0

也許你忘了'match'字? – billpcs

+0

我不這麼認爲,如果我嘗試模式匹配其他任何東西像正常案例類它工作得很好,儘管這就像我的akka​​.actor教程模式匹配演員的接收方法 編輯1: 只是如果你有興趣 - > http://doc.akka.io/docs/akka/2.0/intro/getting-started-first-scala.html – Julian

回答

3

您可以通過名稱僅傳遞參數作爲方法的參數。這是無效的使用這樣的:

case (block: => Unit) => block 

您只能:

case (block: Unit) => block 

但你可以發送功能() => Unit

override def receive: Receive = { 
    case block: (() => Unit) => block() 
    case _ => println("cant work with that") 
} 

actorRef ! (() => println("Hello")) 
+0

這更像是它,非常感謝! – Julian

+0

真的,你不應該把類型單元的消息傳給你的演員。正如你所說,這只是一個教程! – ka4eli

+0

哦好嗎?!我認爲這將是一個很好的方式來使用演員 - >生成一些並給他們codeblocks執行,這是否是一個不好的做法? – Julian