Chapter02 控制结构和函数

来源:互联网 发布:今晚eia数据 编辑:程序博客网 时间:2024/05/15 13:29

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


【待续】

87 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 燃气费用一直未交怎么办 凌度gps模块无法定位怎么办? 放疗定位线掉了怎么办 被网络平台骗了怎么办 手机重力传感器坏了怎么办 锤子手机重力传感器坏了怎么办 平板电脑没有开关键怎么办 手机重力感应器坏了怎么办 苹果手机重力感应器坏了怎么办 苹果手机陀螺仪坏了怎么办 狗狗的爪子肿了怎么办 压缩文件之后显示拒绝访问怎么办 压缩文件解压后全散开了怎么办 dnf助手改名字用完了怎么办 缅甸 佤邦 办中国护照 怎么办? 电脑玩游戏网络延迟大怎么办 qq好友空间锁了怎么办 卡盟进货额不足怎么办 被朋友骗了钱怎么办 联通在学校网差怎么办 前夫把我微信拉黑 孩子的事怎么办 微信好友验证疑似被盗怎么办 我的世界被banip怎么办 dnf深渊宝珠出了怎么办 吞噬魔4个球吃了怎么办 dnf没有支援兵了怎么办 家里没通天然气怎么办 苹果6p16g不够用怎么办 魅蓝手机内存不够用怎么办 3dmax灯光全黑怎么办 高压15o低压1oo怎么办 源码一位乘法中c怎么办 怀孕搬了重东西怎么办 深蹲力量不涨怎么办 ps4连接显示器分辨率低怎么办 大疆失去链接后怎么办 脑袋被锤了几拳怎么办 华为手机变板砖怎么办 电脑网页打开很慢怎么办 网页加载速度太慢.怎么办 cad字显示不出来怎么办