Scala匿名函数使用return出现类型不匹配错误的原因及解决办法
报错原因
- Scala 中
return关键字的作用域是最近的外层用def定义的方法,你在匿名函数(pos: Pos) => ...内写的return,并不会作为匿名函数的返回值,而是直接让外层的terrainFunction方法提前返回Boolean类型的值,自然就和方法声明的返回值类型Pos => Boolean不匹配。 - 另外你写的
catch块语法也不符合Scala规范,Scala的catch需要接模式匹配来捕获指定异常。
修复方案
直接去掉匿名函数内的return,补全正确的异常捕获逻辑即可,Scala 会自动把代码块最后一行的表达式结果作为匿名函数的返回值:
def terrainFunction(levelVector: Vector[Vector[Char]]): Pos => Boolean = { val terrFunc = (pos: Pos) => levelVector(pos.row)(pos.col) != '-' (pos: Pos) => try { terrFunc(pos) } catch { case _: Exception => false // 捕获所有异常时返回false } }
如果想要更好的性能,也可以提前判断下标合法性,避免触发异常,写法更推荐:
def terrainFunction(levelVector: Vector[Vector[Char]]): Pos => Boolean = { (pos: Pos) => pos.row >= 0 && pos.row < levelVector.length && pos.col >= 0 && pos.col < levelVector(pos.row).length && levelVector(pos.row)(pos.col) != '-' }
内容的提问来源于stack exchange,提问作者Phelizer
相关产品推荐
相关产品推荐

