据我了解,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
})

但是,我想知道是否还有另一种“可接受的”方式来做到这一点。也许没有为内部功能命名的可能性?

(一个用例是在循环内模拟一些有值(value)的continue构造。)

编辑

请相信我,有必要避免else语句,因为doMoreStuff部分实际上可能看起来像:
val j = someCalculation(i)
if (j == 0) return 8
val k = needForRecalculation(i)
if (k == j) return 9
finalRecalc(i)
...

当您只有ifelse结构可用时,很容易搞砸。

当然,在开始时给出的简单示例中,仅使用else会更容易。抱歉,我认为这很清楚。

最佳答案

如果您的匿名函数是如此复杂,我将使其更加明确。匿名函数不适合几行以外的任何复杂事情。您可以通过在using方法中声明它来使方法私有(private)

def myF(i:Int):Int = {
    if (i%2 == 0) return i
    doMoreStuffAndReturnSomething(i)
}
someList.map(myF(_))

这是您变通方法的一种变体,但是更干净。他们都将其私有(private)化为本地方法范围。

10-06 04:05