scala中的break

scala不像c++、java提供了break关键字,它是通过Breaks类的方式来提供类似break关键字的预言特性。通过查看Breaks的源码可以知道,它使用了异常及异常处理来模拟实现了break功能。源码如下

/*                     __                                               *\
**     ________ ___   / /  ___     Scala API                            **
**    / __/ __// _ | / /  / _ |    (c) 2003-2013, LAMP/EPFL             **
**  __\ \/ /__/ __ |/ /__/ __ |    http://scala-lang.org/               **
** /____/\___/_/ |_/____/_/ | |                                         **
**                          |/                                          **
\*                                                                      */

package scala
package util.control

/** A class that can be instantiated for the break control abstraction.
 *  Example usage:
 *  {{{
 *  val mybreaks = new Breaks
 *  import mybreaks.{break, breakable}
 *
 *  breakable {
 *    for (...) {
 *      if (...) break()
 *    }
 *  }
 *  }}}
 *  Calls to break from one instantiation of `Breaks` will never
 *  target breakable objects of some other instantiation.
 */
class Breaks {

  private val breakException = new BreakControl

  /**
   * A block from which one can exit with a `break`. The `break` may be
   * executed further down in the call stack provided that it is called on the
   * exact same instance of `Breaks`.
   */
  def breakable(op: => Unit) {
    try {
      op
    } catch {
      case ex: BreakControl =>
        if (ex ne breakException) throw ex
    }
  }

  sealed trait TryBlock[T] {
    def catchBreak(onBreak: =>T): T
  }

  /**
   * This variant enables the execution of a code block in case of a `break()`:
   * {{{
   * tryBreakable {
   *   for (...) {
   *     if (...) break()
   *   }
   * } catchBreak {
   *   doCleanup()
   * }
   * }}}
   */
  def tryBreakable[T](op: =>T) = new TryBlock[T] {
    def catchBreak(onBreak: =>T) = try {
      op
    } catch {
      case ex: BreakControl =>
        if (ex ne breakException) throw ex
        onBreak
    }
  }

  /**
   * Break from dynamically closest enclosing breakable block using this exact
   * `Breaks` instance.
   *
   * @note This might be different than the statically closest enclosing block!
   */
  def break(): Nothing = { throw breakException }
}

/** An object that can be used for the break control abstraction.
 *  Example usage:
 *  {{{
 *  import Breaks.{break, breakable}
 *
 *  breakable {
 *    for (...) {
 *      if (...) break
 *    }
 *  }
 *  }}}
 */
object Breaks extends Breaks

private class BreakControl extends ControlThrowable

从以上源码中可知,使用Breaks的breakable、break函数可实现循环中的break或continue效果。

import scala.util.control.Breaks._

// 等同break
breakable {
  for (i <- 0 until 10) {
    if (i == 7) {
      break
    } else {
      println(i)
    }
  }
}

// 等同continue
for (i <- 0 until 10) {
  breakable {
    if (i == 7) {
      break
    } 
    println(i)
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 3,489评论 1 24
  • 读《快学Scala 》一书的摘要 Scala 运行于JVM之上,拥有海量类库和工具,兼顾函数式编程和面向对象。 在...
    abel_cao阅读 1,298评论 0 8
  • Overview 本节主要介绍各种循环语句 Java 篇 For for 语句可以说是最常用的循环语句了。Java...
    bookislife阅读 574评论 0 0
  • 锐眼视点: Embark 试图用无人驾驶卡车缓解人类卡车司机的重担; 谷歌利用机器学习帮助出版商应对网络语言暴力;...
    锐眼看世界阅读 357评论 0 0
  • 昏暗角落的烟雾缭绕 你说你抽的是寂寞 孩子啊你可知道 寂寞是会上瘾的 命是你自己的命 空气却是大家的空气 请注视孩...
    市井笔农阅读 158评论 0 3