我应该在多行Scala方法中使用返回吗?

Raf*_*ler 4 coding-style scala return

也许这只是我在更多命令式编程中的背景,但我喜欢在我的代码中使用return语句.

我理解在Scala中,许多方法都不需要返回,因为默认情况下返回的是上次计算的值.据我所知,这对于"单线"非常有意义,例如

def square(x) = x * x
Run Code Online (Sandbox Code Playgroud)

我也理解使用显式返回的明确情况(当你的代码可以使用多个分支时,你想要为不同的分支打破方法,例如,如果发生错误).但是多线功能呢?如果有明确的回报,那么它是否更具可读性并且更有意义,例如

def average(x: List[Int]) : Float = {
  var sum = 0
  x.foreach(sum += _)
  return sum / x.length.toFloat
}
Run Code Online (Sandbox Code Playgroud)

Itt*_*ayD 11

def average(x: List[Int]) : Float = 
  x.foldLeft(0)(_ + _) / x.length.toFloat
Run Code Online (Sandbox Code Playgroud)

更新:虽然我的目的是展示如何将迭代代码转换为函数表达式,但@soc正确地评论说更短的版本是 x.sum / x.length.toFloat

我经常发现在Scala中我不太需要"在中间返回".此外,一个大的函数被分解成更小的表达式,这些表达式更清楚.而不是

var x = ...
if (some condition) x = ...
else x = ...
Run Code Online (Sandbox Code Playgroud)

如果(某些条件)我会写...其他....

使用匹配表达式会发生类似的事 而且你总是可以拥有辅助嵌套类.

一旦你习惯了很多形式的表达式来评估结果(例如,'if')而没有return语句,那么在你的方法中使用一个表达式看起来不合适.

在一个工作地点,我们有一个规则,即在方法中间没有"返回",因为您的代码的读者很容易错过它.如果'return'只在最后一行,有什么意义呢?

  • `def average(x:Int*):Double = x.sum/x.length.toDouble`也应该有效. (2认同)

Rex*_*err 10

return并没有告诉你任何额外的东西,所以我发现它实际上使我对正在发生的事情的理解变得混乱.的当然它返回; 没有其他声明!

而且,这也是一个好主意,从使用习惯脱身return,因为它真的不清楚你在哪里返回当你使用大量的功能代码:

def manyFutures = xs.map(x => Futures.future { if (x<5) return Nil else x :: Nil })
Run Code Online (Sandbox Code Playgroud)

返回应该在何处执行?外面manyFutures?只是内部块?

因此,虽然您可以使用显式返回(至少如果您明确地注释返回类型),我建议您尝试习惯使用last-statement-is-the-return-value自定义.