【问题标题】:How are case classes special in Scala? [duplicate]Scala 中的案例类有何特别之处? [复制]
【发布时间】: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”。您可以对ListStream 进行模式匹配,因为它们的伴生对象 定义了unapplyunapplySeq 方法。您可以“手动”执行此操作以创建可以模式匹配的“普通”类,但对于案例类,将自动生成具有这些方法的伴随对象。如果您的班级没有unapplyunapplySeq 的伴随对象,则您无法进行模式匹配; class A(s: String); x match { case A(y) } 不会编译。
  • @lmm 哦,我不知道。因此,如果您在 scala 中有一个没有任何内容的普通类,您就不能对其使用模式匹配?
  • 你仍然可以像case a: A => a.s那样进行模式匹配,但你不能进行“解构”模式匹配case A(y) => y

标签: scala pattern-matching


【解决方案1】:

案例类与普通类有以下不同-

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

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

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

抽象类术语

case class Var(name: String) extends Term

val x = Var("x") println(x.name)

请参考http://docs.scala-lang.org/tutorials/tour/case-classes.htmlhttp://www.scala-lang.org/old/node/258

有关案例类的更多详细信息

【讨论】:

    猜你喜欢
    • 2012-10-22
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多