案例类在Scala中有什么特殊之处?

案例类在Scala中有什么特殊之处?,scala,pattern-matching,Scala,Pattern Matching,根据定义: Scala支持案例类的概念。Case类是导出构造函数参数的常规类,通过模式匹配提供递归分解机制 导出构造函数参数的常规类的含义是什么 总的来说,我理解你如何使用它们。因此,你可以用下面这句话: abstract Class Vehicle case class Car extends Vehicle case class Plane extends Vehicle case class SpaceShip extends Vehicle 然后在每个车辆上应用一个模式匹配,以查看它到

根据定义:


Scala支持案例类的概念。Case类是导出构造函数参数的常规类,通过模式匹配提供递归分解机制


导出构造函数参数的常规类的含义是什么

总的来说,我理解你如何使用它们。因此,你可以用下面这句话:

abstract Class Vehicle
case class Car extends Vehicle
case class Plane extends Vehicle
case class SpaceShip extends Vehicle
然后在每个
车辆上应用一个模式匹配,以查看它到底是什么,但是这不是所有类别都可以做到的吗

x match {
case List(x): something
case Stream(x): something else
}

那么,当编写
案例类
而不仅仅是
时,主要的区别是什么呢?

案例类在以下方面与普通类不同-

1) 您可以不使用new关键字创建case类的实例

2) 您可以使用case类进行模式匹配

3) case类的构造函数参数被视为公共值,可直接访问,如-

抽象类术语

case类Var(名称:String)扩展了术语

val x=Var(“x”)println(x.name)

请参阅 及


有关case类的更多详细信息,我认为,“导出它们的构造函数参数”只是一种奇特的说法,“就像它们的所有构造函数参数都声明为
val
”。您可以对
列表
进行模式匹配,因为它们的伴生对象定义了
unapply
unplyseq
方法。您可以“手动”创建一个“普通”类,该类可以进行模式匹配,但是对于case类,将自动生成带有这些方法的伴随对象。如果您的类没有带有
unapply
unplyseq
的伴生对象,则无法进行模式匹配<代码>A类(s:字符串);x match{case A(y)}
无法编译。@lmm哦,我不知道。因此,如果您在scala中有一个没有写入任何内容的普通类,您就不能对其使用模式匹配?您仍然可以像
案例a:a=>a.s
那样进行模式匹配,但您不能进行“解构”模式匹配
案例a(y)=>y