【发布时间】:2017-05-16 07:05:52
【问题描述】:
我已经读到案例类可以与模式匹配一起使用。但是,我也可以使用带有模式匹配的常规类。 This question 给出了一个常规的 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){ }
主要:
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
我知道我在这里遗漏了一些东西,可能是我对模式匹配的理解。有人可以帮帮我吗?
【问题讨论】:
-
请注意,您不能编写
case Two(t),因为案例类带有一个默认的unapply方法,可以启用它,而常规类则没有(尽管您可以编写一个)。 -
如果我的代码适用于案例 t:Two,我为什么需要案例类?
-
当然,行为将是相同的 - 在这种情况下,它主要是一个可读性问题 -
Two(num)允许您根据需要命名内部变量 - 使您的 intent i> 在这个特定的上下文中更清晰,例如case Two(receivedNum)什么的。正如您引用的答案所述,案例类还有其他好处(例如默认equals和hashCode),但在此特定代码中都不会使用它们。尽管如此 - 将案例类用于“数据容器”类是一种很好的做法 - 如果以及何时以不同方式使用它们,这些可能会派上用场。
标签: scala akka case-class