【发布时间】:2011-02-23 08:12:57
【问题描述】:
据我了解,Scala 中没有办法在匿名函数中有多个返回点,即
someList.map((i) => {
if (i%2 == 0) return i // the early return allows me to avoid the else clause
doMoreStuffAndReturnSomething(i) // thing of this being a few more ifs and returns
})
引发error: return outside method definition。 (如果不提出这个问题,代码就不会像我希望的那样工作。)
我能想到的一种解决方法如下
someList.map({
def f(i: Int):Int = {
if (i%2 == 0) return i
doMoreStuffAndReturnSomething(i)
}
f
})
但是,我想知道是否有另一种“公认”的方式来做到这一点。也许可以不为内部函数命名?
(一个用例是在循环内模拟一些有价值的continue 构造。)
编辑
请相信我,有必要避免使用 else 语句,因为 doMoreStuff 部分实际上可能看起来像:
val j = someCalculation(i)
if (j == 0) return 8
val k = needForRecalculation(i)
if (k == j) return 9
finalRecalc(i)
...
当你只有一个可用的if–else 结构时,很容易搞砸。
当然,在我一开始给出的简单示例中,使用else 会更容易。抱歉,我以为这很清楚。
【问题讨论】:
-
使用 else 语句有什么问题?
-
在您给出的示例中,完全没有理由避免使用
else关键字;如果您使用else,则不会计算额外的表达式,因此在此处使用提前返回将一无所获。 -
对不起,我修改了。认为很明显
doMoreStuff部分实际上做了更多。
标签: scala closures return-value anonymous-function