一、条件表达式
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)
。变量 dx
和 dy
仅作为计算所需要的中间值,很干净地对程序其他部分而言不可见了
在 Scala 中,赋值本身是没有值的—或者,更严格地说,它们的值是 Unit 类型的,该类型只有一个 ()
的值,比如下面的表达式就是 Unit 类型的
{r = r * n; n -= 1}
但因为赋值语句是 Unit 类型的,别把它们串接在一起
x = y = 1 // 错误的写法
y = 1
的值是 ()
, 不能把一个 Unit 类型的值赋值给 x
四、输入和输出
可以使用
print
或println
函数println("Hello World " + 886 + true)
可以使用带 C 风格格式