Scala菜鸟进阶之路之控制结构和函数(二)

语句终止

1、在Scala中行尾位置不需要写分号,只要能够从上下文明确地判断出这里是语句的终止即可。

2、在写比较长的Scala语句时,需要分两行来写,就要确保第一行以一个不能用作语句结尾的符号结尾。通常来说一个比较好的选择是操作符:

举个栗子:

s = s0 + (v - v0) * t +

0.5 * (a - a0) * t * t

**在实际编码中,长表达式通常涉及函数或方法调用,如此一来你并不需要过分担心----在左括号之后,编译器会一直等到与之匹配的右括号才会去推断某处是否为语句结尾。

举个栗子:

if (n > 0) {

r = r * n

n -= 1

}

块表达式和赋值

1、在Scala中,{}块包含一系列表达式,其结果也是一个表达式。块最后一个表达式的值就是块的值。

举个栗子:

这种特性对于某种对某个 val 的初始化需要分多步完成的情况很有用,

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

其中,dx,dy仅作为计算的中间值,很干净地多对程序其他部分而言不可见。

2、在Scala中,赋值动作本身是没有值的,更严格地说他们的值是Unit类型,该类型只有一个值,写做(),因此将赋值语句串接起来是没有意义的。

举个栗子:

一个赋值语句结束的块,  {r = r * n; n -= 1}

值是Unit类型的

x = y = 1 //别这样做,是没有意义的

输入输出

1、输出

print 与 println

举个栗子:

print("Answer:")  与  println("Answer:" + 42)  效果相同

println(42)

printf 格式化输出

举个栗子:

printf("Hello, %s! You are %d years old.\n","Fred", 42)

2、输入

readInt、readDouble、readByte、readShort、readLong、readFloat、readBoolean、readChar等

与上面这些方法不同的是。readLine带一个参数作为提示字符串:

val name = readLine("Your name: ")

print("Your age: ")

val age = readInt()

printf("Hello, %s! You are %d years old.\n","Fred", 42)

循环

1、Scala拥有与Java和C++相同的while和do循环

while (n > 0) {

r = r * n

n -= 1

}

2、Scala中没有与java中对应的for循环类型,但是可以使用如下for语句:

for (i <- 表达式)  i 遍历右边表达式的值

** 在for循环的变量之前并没有val或var的指定。该变量的类型是集合的元素类型,循环变量的作用域一直持续到循环结束。

3、在遍历字符串或者数组的时候,until方法返回一个并不包含上限的区间。

val s = "Hello"

var sum = 0

for (i <- 0 until s.length) // i的最后一个取值是s.length-1

sum  += s(i)

在本例中,事实上我们并不需要使用下标。你可以直接遍历对应的字符序列:

var sum = 0

for (ch <- "Hello") sum += ch

4、Scala中并没有提供break或continue语句来退出循环。如果需要break时,有以下三种方案来解决:

(1)使用Boolean型的控制变量

(2)使用嵌套函数————————你可以从函数当中return。

(3)使用Breaks对象中break方法

import scala.util.control.Breaks._

breakable {

for(){

if () break;//退出breakable块

.......

}

}

在这里,控制权的转移是通过抛出和捕获异常完成的,因此,如果时间很重要的话,你应该尽量避免使用这套机制。

你可能感兴趣的:(Scala菜鸟进阶之路之控制结构和函数(二))