Scala 阿克卡的案例课程有什么特别之处?

Scala 阿克卡的案例课程有什么特别之处?,scala,akka,case-class,Scala,Akka,Case Class,我已经读到case类可以与模式匹配一起使用。但是,我也可以使用带有模式匹配的常规类。 提供常规scala透视图。我想从scala和akka的角度来看这段特定的代码。 例如: 演员级别: class TestActor extends Actor { def receive={ case One(num)=>println("One "+num) case t:Two=>println("Two "+t.num) case _=>println("A

我已经读到case类可以与模式匹配一起使用。但是,我也可以使用带有模式匹配的常规类。 提供常规scala透视图。我想从scala和akka的角度来看这段特定的代码。 例如:

演员级别:

class TestActor extends Actor {

  def receive={
    case One(num)=>println("One "+num)
    case t:Two=>println("Two "+t.num)
    case _=>println("Another")
  }
}

object TestActor{
  case class One(num:Int)
}
第二类:

class Two(var num:Int){  }
主要内容:

输出为:

One 100
Two 200

我知道我在这里遗漏了一些东西,可能是在我对模式匹配的理解上。有人能帮我吗?

正如您所注意到的,Akka中案例类的主要区别在于在匹配时能够使用它们的提取器(不应用方法)(除了您获得的案例类的常见功能,例如
hashCode
equals
,以及将它们作为产品类型使用)

通过一个更大的示例,您可以看到这是如何进行的。例如,假设您正在使用Akka HTTP客户端向第三方服务发出HTTP请求,并且如果您获得
StatusCode.OK
或任何其他状态代码,您希望以不同的方式进行操作。由于
HttpResponse
提供了一种
unapply
方法,因此您可以执行以下操作:

case HttpResponse(StatusCodes.OK, _, entity, _)) => // We're good, parse the data.
case HttpResponse(statusCode, _, _, _)) => // Operate on status code != OK
而不是:

case response: HttpResponse =>
  if (response.statusCode != StatusCodes.OK) {
    // Stuff
  }
  else {
    // Other stuff
  }
当您的逻辑变得更复杂时,只提取您想要的值会非常有用,而且不会太冗长。在我们的代码库中,我们有一些更复杂的多个值,比如:

case (Foo(bar, baz), resp@HttpResponse(statusCode, _, _, _))
当然,您总是可以自己在一个伴生对象中创建一个
不适用的
方法,并获得与case类相同的语义,但是您通常不想编写样板文件,而允许编译器为您完成


总之,在Akka中使用
case class
作为数据容器可以简化模式匹配的工作,这通常是在实现
receive
方法时所做的。

请注意,您不能编写
case Two(t)
,因为case类附带了一个默认的
不适用的
方法,而常规类则不然(尽管您可以编写一个)。如果我的代码与case t:Two一起工作,为什么我需要case类?当然,行为将是相同的-在这种情况下,主要是可读性问题-
Two(num)
允许您随意命名内部变量-使您在特定上下文中的意图更清晰,例如,
案例二(receivedNum)
或其他什么。正如您提到的答案所述,case类还有其他好处(例如,default
equals
hashCode
),但这些好处都没有在这个特定代码中使用。尽管如此,对于作为“数据容器”的类使用案例类是一个很好的实践——如果它们的使用方式不同,那么这些可能会派上用场。
case (Foo(bar, baz), resp@HttpResponse(statusCode, _, _, _))