结构控制和函数
条件表达式
scala中的if/else表达式有值。这个值就是跟在if或else之后的表达式的值。
可以将表达式的值进行复制
val s = if(x > 0) 1 else -1
等同于Java中的三元表达式。x > 0 ? 1 : -1。但不能在 ? : 表达式中插入语句。
如果两个分支的类型不同,则会用两个分支类型的公共超类型。
比如:if (x > 0) “positive” else -1 。一个String,一个Int。公共超类型是Any
如果else部分缺失,比如:if( x > 0) 1 ,那么if语句可能没有交出任何值。但Scala中,每个表达式都应具有某种值,这个问题解决方案是引入一个Unit类,写作()。这个不带else的if语句相当于.
if (x > 0) 1 else ()
注意:如果想在if和else之间进行换行,需要使用花括号。
if ( x > 0 ) {
1 } else if (x == 0) 0 else -1
语句终止
Scala中,行尾的位置上不需要分号。
如果想在单行中写下多个语句,就需要将他们以分号隔开。
if ( n > 0 ) { r = r * n ; n -= 1}
如果写较长的语句,需要分两行写的话,要确保第一行以一个不能用作语句结尾的符号结尾。通常一个比较号的选择是操作符。
s =s0 + (v - v0) * t + // + 告诉解析器这里不是语句的末尾
0.5 * (a - a0) * t * t
实际编码中,无需过分担心 - 在左括号之后,编译器直到匹配的右括号才会去推断某处是否为语句结尾。
Scala程序员更倾向于Kemighan & Ritchie 风格的花括号:
if ( n > 0) {
r = r * n
n -= 1
}
块表达式和赋值
Java中,块语句是一个包含于 {} 中的语句序列。
Scala中,{}块包含一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值。
这种特性对于某个val的初始化需要分多步完成的情况很有用。
例如:val distance = { val dx = x - x0 ; val dy = y - y0; sqrt(dx * dx + dy * dy) }dx和dy作为中间变量,可以很干净的对程序其他部分而言不可见。
Scala中,赋值动作本身是没有值的,或者说,它们的值是Unit类型。
一个以赋值语句结束的块。比如:{ r = r * n ; n -= 1} 的值是Unit类型的。
赋值语句的值是Unit类型,隐藏别把其串联在一起。
x = y =1 , y=1的值是()。
输入和输出
可以使用print和println进行输出,前者不带换行。
- 前缀f ,字符串插值:
print(f"Hello, $name ! In six months, you’ll be ${age + 0.5}%7.2f years old. %n " }
被格式化的字符串以f打头。包含以 打 头 , 并 可 能 带 有 c 风 格 的 格 式 化 字 符 串 的 表 达 式 。 打头,并可能带有c风格的格式化字符串的表达式。 打头,并可能带有c风格的格式化字符串的表达式。name被替换为name变量的值。
表达式 ${ age + 0 . 5 }% 7 . 2f 被替换成 age + 0.5 的值并以宽度为7、精度为2的浮点数格式化. f插值器比printf方法更好,因为它是类型安全的。
对不是数值类型的表达式使用%f,编译器会报错。
-
前缀s,字符串可以包含表达式,但不能有格式化命令
想要被插值的字符串中包含 符 号 , 需 连 续 写 两 次 。 例 如 : 表 达 式 s ” 符号,需连续写两次。例如:表达式s” 符号,需连续写两次。例如: