斯卡拉的案例课和课堂课有什么区别?
我在谷歌搜索找到case class
和class
之间的区别。 大家都提到,当你想对类进行模式匹配时,用例类就是这样。 否则,使用类,并提到一些额外的额外津贴,如等于和哈希代码覆盖。 但是,这些是为什么要使用案例类而不是类的唯一原因?
我想在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。
(你已经提到除最后一个之外的所有东西)。
这些是常规课程的唯一区别。
链接地址: http://www.djcxy.com/p/68263.html上一篇: What is the difference between Scala's case class and class?