Chapter02 控制结构和函数

1. 条件表达式

  • Scala表达式中if/else有值

    if (x > 0) 1 else -1
    
    等同于C++中:x>0 ? 1 : -1
    
  • else 部分缺失,引入Unit类,写成(),不带else的语句等同于:

    if (x > 0) 1 else ()
    

    这里Unit相当于C++中void。

  • Scala没有switch语句。

  • 在REPL(Read-Eval-Print Loop)中输入代码块,可以键入:paste,然后按Ctrl+D结束。


2. 语句终止

  • Scala语言中行尾不需要分号,只要上下文能明确判断出终止即可。

  • 要想在单行中写多个语句,就需要分号隔开。(不推荐使用)

    if(n > 0) {r += 1; n += 1}
    
  • 较长语句以不能用做语句结尾的符号结尾。

    s = 4 + 3 * s0 - 8 +        //这里的+号就告诉编译器,这不是行结尾
         0.5 * 4.3 -2.3
    

3. 块表达式和赋值

  • {}块包含一系列表达式,块的值就是最后一个表达式的值。

  • 赋值语句块的值返回的是Unit类型,写做()

    x = y = 2   //不要这么做,y=2返回的是一个Unit类型
    

4. 输入和输出

  • printprintln不同之处是,println多输出一个换行符。还有一个带有C风格格式化的printf

  • readLine从控制台读入一行(唯一可以带一个参数作为提示符字符串),readInt、readDouble、readBoolean、readChar、readLong、readByte等都是用于输入。


5. 循环

  • while和do循环与C++相同。

  • for循环结构如下。

    //1 to n返回数字1到n的一个区间
    //让变量遍历<-右边的表达式所有值
    for(i <- 1 to n)
        r = r * i
  • 遍历字符串或数组时,用until方法,util方法返回一个并不包含上届的区间。
    val s = "Hello"
    var sum = 0
    for(i <- 0 until s.length)//i的最后一个值为s.length-1
        sum += s(i)

    //上面等价于下面
    for(ch <- "Hello") sum += ch
  • Scala没有提供break或continue

  • 如果要用break可以使用下面三种方法:
    break方法


6. 高级for循环和for推导式

  • for可以提供多个生成器,用分号隔开。
    for(i <- 1 to 3; j <- 1 to 3)
        print(((i * 10) + j) + " ")
  • 每个生成器可以带一个守卫,以if开头的Boolean表达式。(if前没有分号
    for(i <- 1 to 3; j <- 1 to 3 if i != j)
        print(((i * 10) + j) + " ")
  • for循环中可以使用变量。

  • for推导式:for循环体以yeild开始,会构造一个集合,每次迭代生成集合中的一个值。

    for(i <- 1 to 3) yield  i % 3
    //最后生成Vector(1,2,0,1,2,0,1,2,0,1)
  • for推导式生成的集合与第一个生成式的类型兼容。

7. 函数

  • 基本函数定义如下。
    def fac(n : Int) = {//等号右边表达式的类型推出函数返回类型
        var r = 1
        for (i <- 1 to n) r = r * i
        r//可以用return,但不常见
    }
  • 函数不是递归的,就不需要指定返回值。对于递归函数,必须指明返回类型。
    def fac(n : Int) : Int= {//等号右边表达式的类型推出函数返回类型
        if (n <= 0)
            1
        else
            n * fac(n - 1)
    }

8. 默认参数和带名参数

  • 定义如下:
    def f(str: String, left: String = "[", right: String = "]") = {
        left + str + right
    }
  • 调用

    f("Hello", right = "}") // 这里混合使用了未带名参数和带名参数
    

9. 变长参数

  • 定义如下:
    def sum(args: Int*) = {
        var result = 0
        for (arg <- args)
            result += arg
        result
  • 调用
    val s = sum(1, 3, 8, 9)
    val s = sum(1 to 5: _*)//要使用一个值得序列,把1 to 5当成一个序列必须追加:_*

10. 过程

  • 定义:有的函数不返回值,只需要去掉花括号前面的=号,它的返回类型是Unit
    def box(s: String) {
        println("hello world" + s "\n")
    }
    等价于:
    def box(s: String): Unit = {
        println("hello world" + s "\n")
    }

11. 懒值

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

    lazy val words = "hello scala"
    

12. 异常

  • Scala异常工作机制跟Java和C++一样,抛出异常时,比如(throw表示式的类型为Nothing)。

    throw new IllegalArgumentException("x should not be negative")
    
  • 在if/else中,如果一个分支是Nothing类型,则if/else表达式的类型就是另一个分支的类型。

  • 异常捕获用try/catchtry/finallytry/catch/finally


【待续】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值