【发布时间】:2015-01-09 13:57:13
【问题描述】:
根据定义:
Scala 支持案例类的概念。案例类是常规类,它们导出其构造函数参数并通过模式匹配提供递归分解机制。
导出其构造函数参数的常规类是什么意思?
总的来说,我了解您可以如何使用它们。因此,您可以在以下几行中找到一些东西:
abstract Class Vehicle
case class Car extends Vehicle
case class Plane extends Vehicle
case class SpaceShip extends Vehicle
然后在每个Vehicle 上应用模式匹配以查看它到底是什么但是这不是所有类都可能吗?
x match {
case List(x): something
case Stream(x): something else
}
那么写case class 而不是写class 的主要区别是什么?
【问题讨论】:
-
“导出他们的构造函数参数”,我认为,只是一种奇特的说法,“就好像他们所有的构造函数参数都被声明为
val”。您可以对List和Stream进行模式匹配,因为它们的伴生对象 定义了unapply或unapplySeq方法。您可以“手动”执行此操作以创建可以模式匹配的“普通”类,但对于案例类,将自动生成具有这些方法的伴随对象。如果您的班级没有unapply或unapplySeq的伴随对象,则您无法进行模式匹配;class A(s: String); x match { case A(y) }不会编译。 -
@lmm 哦,我不知道。因此,如果您在 scala 中有一个没有任何内容的普通类,您就不能对其使用模式匹配?
-
你仍然可以像
case a: A => a.s那样进行模式匹配,但你不能进行“解构”模式匹配case A(y) => y。