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'只在最后一行,有什么意义呢?
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自定义.