斯卡拉的案例课和课堂课有什么区别?

我在谷歌搜索找到case classclass之间的区别。 大家都提到,当你想对类进行模式匹配时,用例类就是这样。 否则,使用类,并提到一些额外的额外津贴,如等于和哈希代码覆盖。 但是,这些是为什么要使用案例类而不是类的唯一原因?

我想在Scala中这个功能应该有一些非常重要的原因。 什么是解释或是否有资源来了解更多关于Scala案例类的内容?


Case类可以看作是纯粹的和不可变的数据保存对象,应该完全依赖于它们的构造函数参数。

这个功能概念使我们能够

  • 使用紧凑的初始化语法( Node(1, Leaf(2), None))
  • 使用模式匹配来分解它们
  • 隐含地定义了等式比较
  • 结合继承,案例类用于模仿代数数据类型。

    如果一个对象在内部执行有状态计算或展现其他复杂行为,它应该是一个普通的类。


    从技术上讲,类和case类之间没有区别 - 即使编译器在使用case类时也会优化某些东西。 然而,一个案例类被用来替代特定模式的锅炉板,它正在实现代数数据类型。

    这种类型的一个非常简单的例子是树。 例如,二叉树可以像这样实现:

    sealed abstract class Tree
    case class Node(left: Tree, right: Tree) extends Tree
    case class Leaf[A](value: A) extends Tree
    case object EmptyLeaf extends Tree
    

    这使我们能够做到以下几点:

    // DSL-like assignment:
    val treeA = Node(EmptyLeaf, Leaf(5))
    val treeB = Node(Node(Leaf(2), Leaf(3)), Leaf(5))
    
    // On Scala 2.8, modification through cloning:
    val treeC = treeA.copy(left = treeB.left)
    
    // Pretty printing:
    println("Tree A: "+treeA)
    println("Tree B: "+treeB)
    println("Tree C: "+treeC)
    
    // Comparison:
    println("Tree A == Tree B: %s" format (treeA == treeB).toString)
    println("Tree B == Tree C: %s" format (treeB == treeC).toString)
    
    // Pattern matching:
    treeA match {
      case Node(EmptyLeaf, right) => println("Can be reduced to "+right)
      case Node(left, EmptyLeaf) => println("Can be reduced to "+left)
      case _ => println(treeA+" cannot be reduced")
    }
    
    // Pattern matches can be safely done, because the compiler warns about
    // non-exaustive matches:
    def checkTree(t: Tree) = t match {
      case Node(EmptyLeaf, Node(left, right)) =>
      // case Node(EmptyLeaf, Leaf(el)) =>
      case Node(Node(left, right), EmptyLeaf) =>
      case Node(Leaf(el), EmptyLeaf) =>
      case Node(Node(l1, r1), Node(l2, r2)) =>
      case Node(Leaf(e1), Leaf(e2)) =>
      case Node(Node(left, right), Leaf(el)) =>
      case Node(Leaf(el), Node(left, right)) =>
      // case Node(EmptyLeaf, EmptyLeaf) =>
      case Leaf(el) =>
      case EmptyLeaf =>
    }
    

    请注意,树使用相同的语法构造和解构(通过模式匹配),这也正是它们如何打印(减去空格)。

    而且它们也可以用于哈希映射或集合,因为它们有一个有效的,稳定的hashCode。


  • 案例类可以进行模式匹配
  • 案例类自动定义哈希码和等号
  • Case类自动为构造函数参数定义getter方法。
  • (你已经提到除最后一个之外的所有东西)。

    这些是常规课程的唯一区别。

    链接地址: http://www.djcxy.com/p/68263.html

    上一篇: What is the difference between Scala's case class and class?

    下一篇: Case class to map in Scala