第二章 控制结构和函数

  在本章中,会了解Scala的条件表达式、循环、和函数,在Java中表达式和语句是两种不同的东西,表达式有值,而语句执行动作。

  在Scala中,几乎所有构造出来的语法都有值。

1.条件表达式

  val s = if(x > 0 ) 1 else -1

  val s = if(x > 0) "positive" else  -1 //可以输出混合类型,s的类型为Any

  if(x > 0 ) 1 else () //()表示无用值,占位符,将类Unit写成(),相当于Java中的void

2.终止语句

  scala中,行尾不需要分号

      if(n > 0){ r = r * n;return r}

  s = s0 +(v - v0) * t +  //告诉编译器这不是语句的末尾

    0.5 * (a - a0) * t * t

     推荐使用:

  if(n > 0){

    r = r * n

    return r

  }

3.块表达式和赋值

  在Scala中,{}块包含一系列表达式,其结果也是一个表达式,块中最后一个表达式的值就是块的值

4.输入和输出

  使用print和println函数,进行输出

5.循环

  for(i <- 表达式){

  }

6.高级for循环和for推导

  for( i <- 1 to 3; j <-  to 3 if i != j) print((10 * i + j) + " ")  //打印 12 13 21 23 31 32

  for( i <- 1 to 3; from = 4 -1; j  <- from to 3) print((10 * i + j) + " ")

  for( i <- 1 to 10) yield i % 3 // 该循环构造出一个集合

7.函数

  def abs(x: Double) = if (x >= 0 ) x else -x  // =右边是函数体,有时可以省略函数体的{},只要函数不是递归,就不需要指定返回类型

8.默认参数和带名参数

  def decorate(str : String, left:String="[", right:String = "]") = left + str + right

  //这个函数有两个参数,left和right,带有默认值"["和"]"

  decorate("Hello", ">>>[")

  decorate(left = "<<<" , str="Hello", right=">>>")

9.变长参数

  def sum(args: Int*) = {  //使用*来表示变长参数,函数得到的是一个类型为Seq的参数

    var result = 0

    for(arg <- args) result += arg

    result

  }

  val s = sum( 1 to 10) //错误

  val s = sum(1 to 10 : _*) //将1 to 5 当做参数序列处理,:_*告诉编译器将序列转换成参数序列

10.过程

  Scal对于不返回的函数有特殊的表示法。如果函数包含在花括号中,但没有前面的=号,那么返回的类型就是Unit,这样的函数被称作过程(procedure)。过程不返回值。

  def box(s:String){  //仔细看,没有=号

    var border = "-" * s.length + "--\n"

    print(border + "|" + s + "|\n" + border)

  }

11懒值

  当val被声明为lazy时,它的初始化将被推迟,直到我们首次对它取值。例如:

  lazy val  words = scala.io.Source.fromFile("usr/share/dict/words").mkString

12.异常

  Scala中没有"受检"异常,不需要声明说函数或方法可能会抛出某种异常。

  throw表达式有特殊的类型Nothing,如果一个分支的类型是Nothing,那么if/else表达式的类型就是另一个分支的类型。

posted @ 2016-03-25 21:26  云山书童  阅读(100)  评论(0编辑  收藏  举报