【发布时间】:2011-04-15 19:40:52
【问题描述】:
在 Scala 中提供return 语句有什么真正的原因吗? (除了更“Java 友好”之外)
【问题讨论】:
在 Scala 中提供return 语句有什么真正的原因吗? (除了更“Java 友好”之外)
【问题讨论】:
这是一个例子
这个方法有很多if-else语句来控制流程,因为没有return(这是我自带的,你可以发挥想象力来扩展它)。我从一个真实的例子中得到了这个,并将它修改为一个虚拟代码(实际上它比这个更长):
不退货:
def process(request: Request[RawBuffer]): Result = {
if (condition1) {
error()
} else {
val condition2 = doSomethingElse()
if (!condition2) {
error()
} else {
val reply = doAnotherThing()
if (reply == null) {
Logger.warn("Receipt is null. Send bad request")
BadRequest("Coudln't receive receipt")
} else {
reply.hede = initializeHede()
if (reply.hede.isGood) {
success()
} else {
error()
}
}
}
}
}
返回:
def process(request: Request[RawBuffer]): Result = {
if (condition1) {
return error()
}
val condition2 = doSomethingElse()
if (!condition2) {
return error()
}
val reply = doAnotherThing()
if (reply == null) {
Logger.warn("Receipt is null. Send bad request")
return BadRequest("Coudln't receive receipt")
}
reply.hede = initializeHede()
if (reply.hede.isGood)
return success()
return error()
}
在我看来,第二个比第一个更具可读性,甚至更易于管理。如果不使用 return 语句,缩进的深度(使用格式良好的代码)会越来越深。而且我不喜欢它:)
【讨论】:
忽略嵌套函数,总是可以用不带返回的等效计算替换带返回的 Scala 计算。这个结果可以追溯到“结构化编程”的早期,被称为structured program theorem,很巧妙。
使用嵌套函数,情况会发生变化。 Scala 允许您在一系列嵌套函数中放置一个“返回”。执行 return 时,控制跳出所有嵌套函数,进入最里面的包含方法,并从中返回(假设该方法实际上仍在执行,否则将引发异常)。这种堆栈展开可以在例外情况下完成,但不能通过计算的机械重组来完成(在没有嵌套函数的情况下是可能的)。
您实际上希望从嵌套函数内部返回的最常见原因是跳出命令式的理解或资源控制块。 (命令式 for-comprehension 的主体被转换为嵌套函数,即使它看起来就像一个语句。)
for(i<- 1 to bezillion; j <- i to bezillion+6){
if(expensiveCalculation(i, j)){
return otherExpensiveCalculation(i, j)
}
withExpensiveResource(urlForExpensiveResource){ resource =>
// do a bunch of stuff
if(done) return
//do a bunch of other stuff
if(reallyDoneThisTime) return
//final batch of stuff
}
【讨论】:
提供它是为了适应那些难以或麻烦地将所有控制流路径安排在方法的词汇端收敛的情况。
虽然正如 Dave Griffith 所说,您可以消除对 return 的任何使用,这当然是正确的,但这样做通常比简单地用明显的 return 缩短执行时间更容易混淆。
还要注意,return 从方法返回,而不是从方法中定义的函数(文字)。
【讨论】:
我认为return 在编写命令式代码时很有用,这通常意味着 I/O 代码。如果您正在编写纯函数式代码,则不需要(也不应该使用)return。但是对于函数式代码,您可能需要惰性来获得与使用return 可以“提前逃逸”的命令式代码等效的性能。
【讨论】: