为什么Scala在for循环中返回给出Unit值类型?

时间:2017-06-28 14:37:02

标签: scala

我已经编写了一个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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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
}

答案 2 :(得分:0)

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

问题是for循环本身。如果没有yield,它只是充当副作用的构造。表示它返回Unit。非常类似于foreach语义。

了解更多here