快学Scala(2) 控制结构和函数

来源:互联网 发布:柴可夫斯基妻子知乎 编辑:程序博客网 时间:2024/05/19 13:15

1. 条件表达式

//普通形势的if-elseif(x > 0) 1 else -1//if-else返回类型,是分支类型的公共超类型,如以下表达式的超类型是Anyif(x > 0) "string" else -1//如果缺少了else,那么else返回类型就是Unitif(x>0) 1//Scala中没有switch语句

2. 循环

//while与do-while循环与Java没有区别//for循环不存在for(int i = 0; i < 10 ; i++)的形式//1. for的形式是for(i <- 表达式)//2. 如果for循环中的i之前没有指定过val或var,那么该变量类型就是集合元素的类型,作用域持续到循环结束//3. Scala中没有break或continue,可以通过三种形式来解决://  1)Boolean控制//  2)循环体中使用return//  3)scala.util.control.Breaks.break方法//4. 可以有多个生成器,每个生成器都可以有守卫//5. 在循环体后添加yield,即for推导式,可以生成集合for(i <- 1 to 10) yield i % 3//生成(1,2,0,1,2,0,1,2,0,1)for(i <- 1 to 3; j <- 1 to 3 if i!=j)

3. 函数

  • 不是递归函数就不需要指定返回值,递归函数必须指定返回值
  • 函数参数可以带默认值,调用函数时可以指定参数名,也可以不指定,也可以混用
  • 变长函数
//一般函数,可以不指定返回值def abs(x: Double) = if(x >=0) x else -x//递归函数,必须指定返回值def fac(n: Int) : Int = if (n <= 0) 1 else n * fac(n-1)//默认参数def decorate(str:String, left:String="[", right: String) = left + str + right//以下调用均可decorate("Hello")decorate("Hello","<<[")decorate("Hello",right="]>>")//没有默认参数的,不能不调用//变长参数//函数体内得到的是一个Seq参数,但如果有一个Seq对象,不能直接作为变长函数的输入//如果要作为参数,必须追加 :_*def sum(args: Int*) = {    var result = 0    for (arg <- args) result += arg    result}val s = sum(1 to 5) //wrongval s = sum(1 to 5: _*) //right

4. TIPS

  • REPL中,如果要输入多行代码,就用:paste
  • 复制表达式的返回值是Unit,所以不能使用x=y=1这样的表达式
  • 在写较长的语句、需要分为两行是,要确保第一行不能用做语句结尾的符号结尾
  • 块表达式也有输出结果,最后一个表达式就是输出。
  • 懒值:在val之前添加lazy。懒值必须是val,不能是var。
  • 异常:scala没有“受检”异常,即不需要在函数或方法上声明,需要抛出哪些异常。
0 0