Scala抽象类

时间:2017-09-09 22:42:05

标签: scala abstract-class case-class

我正在从Coursera学习Scala课程,并且在抽象课上遇到了一些问题。在这里,我试图从CodeTree抽象类的case类中访问字段,但是编译器抱怨这些字段不属于CodeTree类本身。我认为模式匹配会照顾到这一点,但显然它并没有。有什么帮助吗?

function makeHttpRequest(){

  $http.post("your-url-goes-here")
       .then(successCallback, errorCallback);

  function successCallback(obj){
    // do something...
  } 

  function errorCallback(err){
    makeHttpRequest();
  }
}

1 个答案:

答案 0 :(得分:1)

编译器是对的,你的抽象类没有实例变量。

好消息是你不需要它们,你已经从tree输入参数的模式匹配中获得了所需的一切。

只需将您的代码修改为:

abstract class CodeTree
case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree
case class Leaf(char: Char, weight: Int) extends CodeTree

def weight(tree: CodeTree): Int = tree match {
  case Leaf(_, weight) => weight
  case Fork(left, right, _, _) => weight(left) + weight(right)
}

当您在Scala中成功进行模式匹配时,匹配子句左侧的变量可用于子句本身的右侧,因此:

  • 在您的第一个条款中,您匹配Leaf,因此您可以在右侧使用weight变量,只需将其返回
  • 在您的第二个条款中,您匹配Fork,因此右侧可以使用leftright个变量(您放弃chars和{{1变量),以递归方式调用weight函数

您可以参考Scala Tour以更好地了解模式匹配的工作原理。