scala内建控制结构

内建控制结构

  scala的控制结构都会产生某个值。这是函数式语言所采用的方式,程序被看成是计算值的活动,因此程序的控件也应当这么做

 

if表达式

  scala的if是能返回值的表达式

  val是函数式的风格

  val更好的支持等效推论

  在表达式没有副作用的前提下,引入的变量等效于计算它的表达式,因此可以用表达式替代变量名

 

while循环

  while和do-while结构被称为“循环”,不是表达式,因为它们不产生有意义的结果,结果的类型是unit

  说明产生的值的类型为unit,写做()。()的存在是scala的unit不同于java的void的地方

 

for表达式

  枚举集合类

    val filesHere = (new java.io.File(".")).listFiles

    for(file<-filesHere)

      println(file)

  过滤

    如果你想过滤出一个子集,可以通过过滤器:filter:一个if子句加到for的括号里做到

    val filesHere = (new java.io.File(".")).listFiles

    for(file<-fileshere if file.getName.endsWith(".scala"))

      println(file)

  嵌套枚举

    如果加入多个<-子句,就可以嵌套的循环

    def fileLines(file: java.io.File) = scala.io.Source.fromFile(file).getLines.toList

    def grep(pattern: String) =

      for { file <- filesHere

          if file.getName.endsWith(".scala")

          line <- fileLines(file)

          if line.trim.matches(pattern)

      } println(file + ": " + line.trim)

      grep(".*gcd.*")

    可以使用大括号代替小括号环绕发生器和过滤器,好处是可以省略一些使用小括号必须加的分号

  mid-stream(流间)变量绑定

    通过用等号(=)把结果绑定到新变量可以做到这点,绑定的变量被当作val引入和使用,不过不用带关键字val

  制造新集合

    可以创建一个值去记住每一次的迭代,只要在for表达式之前加上关键字yield

    def scalaFiles =

      for {

        file <- filesHere

        if file.getName.endsWith(".scala")

      } yield file

 

使用try表达式处理异常

  抛出异常

    throw new IllegalArgumentException

    throw也是有结果类型的表达式

    val half =

      if (n % 2 == 0)

        n / 2

      else

        throw new RuntimeException("n must be even")

    把抛出的异常当作任何类型的值都是安全的

  捕获异常

    try {

      val f = new FileReader("input.txt")

      // Use and close file

    } catch {

      case ex: FileNotFoundException => // Handle missing file

      case ex: IOException => // Handle other I/O error

    }

  finally子句

    无论如何都要执行的语句

  生成值

    try-catch-finally也产生值

    def urlFor(path: String) =

      try {

        new URL(path)

      } catch {

        case e: MalformedURLException => new URL("http://www.scalalang.org")

      }

  

match表达式

  match表达式可以让你使用任意的模式做选择

  val firstArg = if (args.length > 0) args(0) else ""

  firstArg match {

    case "salt" => println("pepper")

    case "chips" => println("salsa")

    case "eggs" => println("bacon")

    case _ => println("huh?")

  }

 

离开break和continue

  函数式风格劲量不要用

 

变量范围

  和java一样

  

 

posted @ 2014-05-19 15:17  褐色键盘  阅读(142)  评论(0)    收藏  举报