2015-09-07 28 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