Scala返回语句行为

时间:2018-03-26 05:38:01

标签: scala conditional-statements

我在下面定义了一种方法。

def diff(x:Int,y:Int)={ if (x>y) (x+y).toString else x-y }

工作正常。

如果我使用如下的return语句则会抛出错误

def diff(x:Int,y:Int)={if (x>y) return (x+y).toString else return x-y}
  

结果需要返回类型

当我明确定义类型Any时,以下代码正常工作。 当我没有明确定义结果类型时,为什么这不会推断为any

def diff(x:Int,y:Int):Any={if (x>y) return (x+y).toString else return x-y}

2 个答案:

答案 0 :(得分:3)

如果方法中存在返回,则Scala无法知道该点的返回类型(因为它可能会在示例中返回更多)。

因此Scala的编译器必须检查整个方法以寻找更多的退出点(返回)。这将增加编译和推断类型所花费的复杂性和时间。

编译器为避免这种情况而给出的解决方案是,如果存在返回,则强制定义输出类型。

您可以避免退货,并推断出类型:

这里的简单例子

返回没有明确的类型

def myFunc(x: Int) = return x+1
<console>:7: error: method myFunc has return statement; needs result type
       def myFunc(x: Int) = return x+1

无法返回,类型已正确推断

scala> def myFunc(x: Int) = x+1
myFunc: (x: Int)Int

以明确的类型返回

scala> def myFunc(x: Int): Int = return x+1
myFunc: (x: Int)Int

答案 1 :(得分:0)

Scala函数不需要显式return。函数体中的最后一个表达式通常被解释为函数调用的返回值。

重写你的功能:

def diff(x:Int,y:Int): Any = {
    if (x>y) (x+y).toString
    else scalax-y
}

您的第二个函数会抛出错误,因为您可以从错误消息中清楚地看到,scala对于函数的返回类型是多么困惑(并且理所当然)。您的函数返回StringInt,具体取决于条件,因此您需要为scala指定显式类型。

根据此answer,当类型可以推广到比Any更具体的内容时,Scala不会推断Any