【问题标题】:Purpose of "return" statement in Scala?Scala中“return”语句的目的?
【发布时间】:2011-04-15 19:40:52
【问题描述】:

在 Scala 中提供return 语句有什么真正的原因吗? (除了更“Java 友好”之外)

【问题讨论】:

    标签: java scala return


    【解决方案1】:

    这是一个例子

    这个方法有很多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 程序员(不是我)可以更清楚地遵循第一个 sn-p。
    • 确实有点“味道”,取决于开发人员的观点。例如我最喜欢公寓的
    【解决方案2】:

    忽略嵌套函数,总是可以用不带返回的等效计算替换带返回的 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
    }
    

    【讨论】:

    • 我认为这是一个更正式的答案。我对你提到的结果的证明感兴趣。你能提供一些参考资料吗?
    • 添加了结构化程序定理的维基百科链接。
    【解决方案3】:

    提供它是为了适应那些难以或麻烦地将所有控制流路径安排在方法的词汇端收敛的情况。

    虽然正如 Dave Griffith 所说,您可以消除对 return 的任何使用,这当然是正确的,但这样做通常比简单地用明显的 return 缩短执行时间更容易混淆。

    还要注意,return 从方法返回,而不是从方法中定义的函数(文字)。

    【讨论】:

    • 我知道这就是答案。我就是想不出任何例子。
    【解决方案4】:

    我认为return 在编写命令式代码时很有用,这通常意味着 I/O 代码。如果您正在编写纯函数式代码,则不需要(也不应该使用)return。但是对于函数式代码,您可能需要惰性来获得与使用return 可以“提前逃逸”的命令式代码等效的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 2013-06-04
      • 2016-12-29
      相关资源
      最近更新 更多