使用return语句和默认返回最后一个值有什么区别?

时间:2014-10-31 12:40:00

标签: scala methods return

我正在学习Scala,我注意到了一些关于使用return语句的内容。

因此,显然在Scala中,如果您没有返回语句,则默认返回最后一个值。哪个好。但是如果你使用return语句而没有指定返回类型,Scala说"error: method testMethod has return statement; needs result type"

所以这是有效的

  def testMethod(arg: Int) = {
    arg*2
  }

但这会产生错误

  def testMethod(arg: Int) = {
    return arg*2
  }

这让我刮伤了下巴然后去了

  

Mmmmmmmm ......必须有这样的理由。

为什么在使用return语句时需要显式类型声明,而在让Scala返回最后一个值时不需要?我假设它们是完全相同的,并且返回语句只适用于你想在嵌套函数/条件等中返回一个值(换句话说,一个" return"语句是自动的由编译器插入到您的最后一个值..如果方法中的任何其他位置都不存在)

但显然我错了。当然,实施中肯定会有其他一些差异吗?

我错过了什么吗?

3 个答案:

答案 0 :(得分:5)

如果您的方法有多个退出点,编译器可能无法推断返回类型。从方法中获得多个退出点的唯一方法是使用多个return。 (或者一个return加上隐式返回。)

由于规则在工作时和工作时都非常复杂,因此可能会向用户表明它有时会随机工作,有时却不会。在存在明确return的情况下完全禁止类型推断是一个更简单的规则,即使有点限制。

答案 1 :(得分:1)

这个问题是"When is a return type required for methods in Scala?"一个完全不同的问题,但它与OP属于同一个领域。


这个答案解释了什么时候(不是为什么)你必须给它一个返回类型:

https://stackoverflow.com/a/3127260/2567273

Chapter 2. Type Less, Do More 一书的Programming Scala提及:

  

当需要显式类型注释时

     

实际上,您必须为以下情况提供明确的类型注释:

     

在以下情况下返回值的方法:

     
      
  • 当您在方法中显式调用return时(即使在最后)。
  •   
  • 当一个方法递归时。
  •   
  • 当方法重载并且其中一个方法调用另一个方法时。调用方法需要返回类型注释。
  •   
  • 当推断的返回类型比您预期的更为通用时,例如Any
  •   

这并不能解释为什么你必须指定一个回报(仅限于何时),但我会坚持我在评论中所说的内容。在使用return关键字时必须指定返回类型的原因是因为编译器将查找您为其提供返回类型,否则它将自己推断返回类型,就像您没有根本不使用return。如果你专门使用return,你可以通过告诉它返回什么来帮助编译器,然后它希望你告诉它你要返回什么类型。

答案 2 :(得分:1)

您认为类型推断标记应该如何返回类型:

def func(n:Int) = {
    if(n<10) return 23;
    if(n>10) true else false;
}

第一行表明返回值应为Int类型。但隐含的回报暗示了一个布尔值。因此,对于究竟应该是什么样的返回类型,它变得非常值得商榷。 IntBooleanAny

如果没有使用显式返回,则确定函数的返回类型非常简单。但有了它,它有点模糊和未知。最简单的解决方案是让用户明确指定返回类型。这使编译器的生活更加轻松。

此外,团队希望不鼓励使用显式返回类型,因此让人们放置手动类型的目的是:)