我正在学习Scala的Akka,并且还在阅读Scala的模式匹配/案例陈述。
在Akka,我可以写一个演员如下:
class MyActor extends Actor {
def receive: Receive = {
case msg: MyMsgClass => sender ! "message received!"
}
}
问题:
这是Scala模式匹配的情况吗?如果是,为什么没有相应的match
关键字?
在case
行中,msg
是标识符,是否需要?如果我省略它并只使用类名会发生什么(假设我没有提供标识符,我不能自己使用变量)?
答案 0 :(得分:6)
这是模式匹配的一种情况,与部分功能相结合。简而言之,部分功能
{
case msg: MyMsgClass
}
仅在存在类型为MyMsgClass
的参数时才匹配。它处理一个部分子集'可能的价值观。此语法生成一个PartialFunction
对象,用于处理输入为MyMsgClass
的情况。
你也可以写:
{
case MyMsgClass(value) => sender ! value
}
但在这种情况下,您只能获得value
。你甚至可以做一些复杂的事情:
{
case m @ MyMsgClass(AnotherClass(_), "this must be this string", a) => sender ! doSomething(m, a)
}
它只会匹配MyMsgClass
个第一个参数类型为AnotherClass
的{{1}}对象(无论其参数如何,因此_
),确切的字符串"this must be this string"
和值a
。 m @
语法表示对象本身也被使用,而不仅仅是一种类型。
更多信息:http://blog.bruchez.name/2011/10/scala-partial-functions-without-phd.html
答案 1 :(得分:1)
您可以从Scaladocs for Actor中看到Receive被定义为具有type:type Receive = PartialFunction [Any,Unit],这实际上意味着它是一个被定义为部分函数的抽象成员。