scala - Scala未使用的表达式错误与if语句
问题描述
我对 Scala 很陌生,并尝试编写一个简单的 Scala 程序来获得最大值。我发现了一些奇怪的东西(可能是特定于语言的功能)。这里是:
def max(xs: List[Int]): Int = {
if (xs.isEmpty) {
throw new java.util.NoSuchElementException
}
def maxAux(x: List[Int], curMax: Int): Int = {
if (x.isEmpty) {
curMax
}
if (x.head > curMax) {
maxAux(x.tail, x.head)
}
else {
maxAux(x.tail, curMax)
}
}
maxAux(xs.tail, xs.head)
}
}
出于某种原因,在maxAux
函数内部,第一条if
语句的返回给了我一个 IntelliJ 警告,它是一个“未使用的表达式”。事实证明这是正确的,因为那条线似乎没有返回。为了解决这个问题,maxAux
I 中的第二个 if 语句更改为else if
,然后一切都按预期工作。另一个解决方法是在return
之前添加一个语句curMax
,但显然使用return
是不好的风格/做法。
TL;DR:谁能解释为什么上面的代码curMax
没有返回?
解决方案
直接的问题是 Scala 返回块中最后一个表达式的值,即第二个if
/else
表达式。所以第一个的值if
只是被丢弃了。这可以通过将第二个设置if
为 an来解决,使其else if
成为单个表达式。
更好的解决方案是使用match
,这是取消选择 a 的标准方法List
:
def maxAux(x: List[Int], curMax: Int): Int =
x match {
case Nil =>
curMax
case max :: tail if max > curMax =>
maxAux(tail, max)
case _ :: tail =>
maxAux(tail, curMax)
}
推荐阅读
- java - Docker-compose、Java 和 Redis - 连接被拒绝问题
- javascript - AngularJS ng-repeat 问题和具有匹配答案对象的初始化输入
- reactjs - redux 状态正在改变,但组件没有重新渲染
- ios - CoreGraphics PDF 记录了一个错误。设置环境变量“CG_PDF_VERBOSE”以了解更多信息
- angular - Angular 问题中的全局消息服务
- simulink - 如何模拟 Sent_Protocl_signal?
- java - 新 Java 9 日志记录与现有日志记录 API 的关系
- isabelle - 如何通过评估简化归纳谓词?
- javascript - 如何为我的排行榜创建两列?
- java - 如何从另一个类调用存储在 applicationScope 中的 ArrayList