【问题标题】:Why Scala return in for-loop give Unit value type?为什么Scala在for循环中返回给Unit值类型?
【发布时间】:2017-06-28 14:37:01
【问题描述】:

我写了一个for循环遍历Map,我希望这个函数在找到某个值时立即返回键(键和值都是Int类型)

var hs:Map[Int,Int] = Map(1 -> 1, 2 -> 2)
for ((k,v) <- hs) {
  if (v == 1)
    return k   
}

但是,scala 给我错误信息:

error: type mismatch;
 found   : Unit
 required: Int
  for ((k,v) <- hst)
             ^
one error found

那我换成

var result = 0
for ((k, v) <- hst){
  if (v == 1)
    result = k
}
result

然后,它运行良好。为什么第一个版本有类型问题?

【问题讨论】:

    标签: scala


    【解决方案1】:

    编译错误由@D.Peter 解释,该子句缺少return

    Scala 中,您可以使用 find 来执行此操作,例如:

    hs.find(_._2 == 1).map(_._1).getOrElse(0) // get or return default value.
    

    【讨论】:

      【解决方案2】:

      如果你的函数从未在 if 语句中输入,你就忘了返回一些东西

      def a() : Int = {
          var hs:Map[Int,Int] = Map(1 -> 1, 2 -> 2)
          for ((k,v) <- hs) {
              if (v == 1){
                  return k
              }   
          }
          return -1
      }
      

      【讨论】:

      • 一般情况下,避免退货。在 Scala 中,您永远不会在块末尾的结果位置使用 return。
      • 我猜一般避免使用这个丑陋的for循环......这是向他展示他的错误,而不是告诉最佳实践
      • 您确实会在惯用代码中看到带有 return 的命令式循环,以提高效率。另一个有趣的部分是 return 的类型是 Nothing,条件是 if (c) ??? else ()Unit
      【解决方案3】:

      接受的答案不是很准确,因为它不是关于输入if statement,即使您删除if 条件它仍然无法编译。

      问题在于 for 循环本身。如果没有yield,它只会充当副作用的构造。这意味着它返回Unit。很像 foreach 语义。

      阅读更多here

      【讨论】:

        猜你喜欢
        • 2018-07-18
        • 2012-04-04
        • 2013-01-18
        • 2015-04-18
        • 1970-01-01
        • 2020-10-05
        • 1970-01-01
        • 1970-01-01
        • 2020-01-07
        相关资源
        最近更新 更多