Scala匹配错误

时间:2011-02-15 05:59:21

标签: scala

我尝试用匹配替换我的isInstanceOf检查,但它不起作用。

在我的方法中,我检查一个树节点 - 如果它是一个叶子 - 我想立即将它返回到Vector中,如果不是 - 我继续使用该方法。

最初我有:

    //code here
    if (common.isInstanceOf[LeafNode]) {
        return Vector(common.asInstanceOf[LeafNode].data)
    }
    //code here

然后我尝试将其替换为:

    //code here
     common match {
        case leaf: LeafNode => return Vector(leaf.data)
    }
    //code here

但是我得到了scala.MatchError。

2 个答案:

答案 0 :(得分:26)

如果您的MatchError不是common,则会收到LeafNode。您的ifmatch表达式不相同。我认为最直接的方法是:

common match {
  case leaf: LeafNode => return Vector(leaf.data)
  case _ =>
}

但我建议查看整个代码块,然后找出更有效的方法来完成这项工作。也就是说,中间没有return。请记住,匹配是一个表达式,所以这样的事情是可能的:

def foo = {
  //code here
  common match {
    case leaf: LeafNode => Vector(leaf.data)
    case notLeaf: Branch => //code here
  }
}

答案 1 :(得分:5)

问题在于match块中的案例集并非详尽无遗;如果common不是LeafNode,则会引发MatchError。你可以通过这样一个包罗万象的案例来解决这个问题:

common match {
  case leaf: LeafNode => return Vector(leaf.data)
  ... // other cases
  case other => ... // what to do if nothing else matches
}

这类似于Java switch语句中的default情况。 other案例被称为“无可辩驳的模式”,因为它没有特征;它不需要特定的类型或构造函数,因此它将始终匹配任何落在它上面的东西。变量的名称不必是other,它可以是您想要的任何内容,甚至是_ ...实际上您不需要在此处绑定新变量,因为它将与common相同。

在样式上,将return语句放在match块中通常是不好的形式;整个块是一个表达式,它根据其中一个案例进行求值,因此只返回整个表达式。此外,您根本不需要使用return关键字,因为函数定义中的最后一个表达式将用作结果。