第二章 控制结构和函数
在本章中,会了解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表达式的类型就是另一个分支的类型。