《快学Scala》 第2章 控制结构和函数

一、条件表达式

Scala 的 if/else 语法结构和 Java 或 C++一样。不过在 Scala 中的 if/else表达式有值,这个值就是跟在 if 或 else 之后的表达式的值,且该表达式的类型为 Int ,例如

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

Scala 的 if/else 将在 Java 和 C++ 中分开的两个语法结构 if/else 和 ?: 结合一起了

在 Scala 中,每个表达式都有一个类型,在下面的混合类型表达式中

if (x > 0) "postitive" else 1

上述表达式的类型是两个分支类型的公共超类型,其中一个分支是 java.lang.String,而另外一个分支是 Int。它们的公共超类型叫做 Any。若表达式中的 else 部分缺失了,比如

if (x > 0) 1    <=>   if (x > 0) 1 else ()

那它缺失分支的类型是?解决方案是引入一个 Unit 类,写作 ()。等价的表达式如上所示,这里可以把 () 当做 “无有用值” 的占位符,将 Unit 当做 Java 或 C++ 中的 void 。从技术上讲, void 没有值但是 Unit 有一个表示“无值”的值,好比 “空的钱包”和“里面有一张写着‘没钱’的无面值钞票的钱包”的区别

说明Scala 没有 switch 语句,不过它有一个强大得多的模式匹配机制

注意 REPL 比起编译器来更加“近视”——它在同一时间只能看到一行代码,例如

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

REPL 会执行 if (x > 0) 1 ,然后显示结果。之后它看到接下来的 else 关键字就会不知所措。如果想在 else 前换行的话,用花括号 {}

if (x > 0) { 1
} else if (x == 0) 0 else -1

只有在 REPL 中才会有这个顾虑的,在被编译的程序中,解释器会找到下一行的 else

提示如果想在 REPL 中粘贴成块的代码,而不像担心 REPL 的近视问题,可以使用粘贴模式。键入

:paste

把代码块粘贴进入,然后按下 Ctrl+D 。遮掩 REPL 就会把代码块当作一个整体来分析


二、语句终止

在 Scala 中,行尾的位置不需要分号,只要能够从上下文明确地判断出这里是语句的终止即可。当书写较长代码的语句时,需要分两行写,就要确保第一行以一个不能用做语句结尾的符号结尾。通常来说一个比较好的选择是操作符:

s = s0 + ( v - v0) * t +    // + 告诉解析器这里不是语句的末尾
0.5 * (a - a0) * t * t

当然 Scala 程序员更倾向于 花括号 来清除的表示后面还有更多内容


三、块表达式和赋值

在 Scala 中, {} 块包含一系列表达式其结果也是一个表达式块中最后一个表达式的值就是块的值。这个特性对那种对某个 val 的初始化 需要分多步完成的情况很有用,例如

val distance = {
  val dx = x - x0; val dy = y - y0; sqrt(dx*dx + dy*dy)}

{} 块的值取其最后一个表达式,即 sqrt(dx*dx + dy*dy) 。变量 dxdy 仅作为计算所需要的中间值,很干净地对程序其他部分而言不可见了

在 Scala 中,赋值本身是没有值的—或者,更严格地说,它们的值是 Unit 类型的,该类型只有一个 () 的值,比如下面的表达式就是 Unit 类型的

{r = r * n; n -= 1}

但因为赋值语句是 Unit 类型的,别把它们串接在一起

x = y = 1   // 错误的写法

y = 1 的值是 (), 不能把一个 Unit 类型的值赋值给 x


四、输入和输出

  • 可以使用 printprintln 函数

    println("Hello World " + 886 + true)
  • 可以使用带 C 风格格式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值