gpt4 book ai didi

scala - Akka 中的案例类有什么特别之处?

转载 作者:行者123 更新时间:2023-12-01 00:35:38 26 4
gpt4 key购买 nike

我读过案例类可以与模式匹配一​​起使用。但是,我也可以使用具有模式匹配的常规类。
This question给出了一个常规的 Scala 视角。对于此特定代码,我希望从 Scala 和 akka 的角度来看它。
例如:

Actor 类:

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){  }

主要的:
object Main2 extends App{

val system=ActorSystem("t")
val testActor=system.actorOf(Props[TestActor],"test")

val t=new Two(200)
val o=TestActor.One(100)

testActor!o
testActor!t

}

输出是:
One 100
Two 200

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

最佳答案

正如您所注意到的,Akka 中 case 类的主要区别在于匹配时能够使用它们的提取器(unapply 方法)(除了您从 case 类中获得的常用功能,例如 hashCodeequals 和将它们作为产品类型使用)。

通过一个更大的例子,你可以看到它的表现如何。例如,假设您正在使用 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, _, _, _))

当然,您始终可以自己在伴随对象中创建一个 unapply 方法,并自己获得与 case 类相同的语义,但您通常不想编写该样板,让编译器为您完成。

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

关于scala - Akka 中的案例类有什么特别之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41422342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com