我尝试用匹配替换我的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。
答案 0 :(得分:26)
如果您的MatchError
不是common
,则会收到LeafNode
。您的if
和match
表达式不相同。我认为最直接的方法是:
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
关键字,因为函数定义中的最后一个表达式将用作结果。