Akka&案件陈述

时间:2014-08-05 16:48:54

标签: scala pattern-matching akka

我正在学习Scala的Akka,并且还在阅读Scala的模式匹配/案例陈述。

在Akka,我可以写一个演员如下:

class MyActor extends Actor {
    def receive: Receive = {
        case msg: MyMsgClass => sender ! "message received!"
    }
}

问题:

  1. 这是Scala模式匹配的情况吗?如果是,为什么没有相应的match关键字?

  2. case行中,msg是标识符,是否需要?如果我省略它并只使用类名会发生什么(假设我没有提供标识符,我不能自己使用变量)?

2 个答案:

答案 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"和值am @语法表示对象本身也被使用,而不仅仅是一种类型。

更多信息:http://blog.bruchez.name/2011/10/scala-partial-functions-without-phd.html

答案 1 :(得分:1)

您可以从Scaladocs for Actor中看到Receive被定义为具有type:type Receive = PartialFunction [Any,Unit],这实际上意味着它是一个被定义为部分函数的抽象成员。