我正在从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();
}
}
答案 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
,因此右侧可以使用left
和right
个变量(您放弃chars
和{{1变量),以递归方式调用weight
函数您可以参考Scala Tour以更好地了解模式匹配的工作原理。