参考
《Scala 编程》
重要理解
Scala 中,几乎所有的控制语句都会产生某个值
if 语句
先来看一个指令式形式的 scala 代码:
var filename = "default.txt"
if(!args.isEmpty)
filename = args(0)
代码的作用是当输入的参数不为空时,将参数值给 filename,否则为 default.txt
但是,上面有说到的,其实 if 语句也是会产生值返回的,下面的是函数式风格的 scala
val filename =
if(!args.isEmpty) args(0)
else "default.txt"
实现的效果是一样的,区别在于:
- 使用了 val,节省了审查变量作用域的时间
for 表达式
常用 for 循环
scala> for (i <- 1 to 4)
| print(i+" ")
1 2 3 4
scala> for (i <- 1 until 4)
| print(i+" ")
1 2 3
另外,scala 中很少使用 for (i <- 0 to array.length-1)
这种形式来遍历数组,因为其集合本身可以直接被枚举 for(i <- array)
过滤
scala> for (i <- 1 to 10 if i%2==0)
| print(i+" ")
2 4 6 8 10
直接在遍历语句后加入判断条件
制造新集合
scala> val oddnums = for (i <- 1 to 10 if i%2!=0) yield {i}
oddnums: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 3, 5, 7, 9)
异常处理
抛出异常
scala 抛出异常的表达跟 Java 一样
throw new IllegalArgumentException
其实,throw 也是有返回值的,其抛出异常的类型为 Nothing,但其实是用不上的
val half =
if(n%2==0)
n/2
else
throw new RuntimeException("n must be even")
捕获异常
import java.io.FIleReader
import java.io.FileNotFoundException
import java.io.IOException
try {
val f = new FIleReader("input.txt")
// 使用并关闭文件
}catch{
case ex: FileNotFoundException => // 处理丢失的文件
case ex: IOException => // 处理其他的 I/O 错误
}
finally 子句
finally 子句的作用在于,不管代码以何种方式结束(正常或出错),都会自行其中的代码
import java.io.FIleReader
val f = new FIleReader("input.txt")
try {
// 使用文件
} finally {
file.close(); // 确保文件的关闭
}
产生值
跟其他控制语句一样,try-catch 也会有返回值
import java.net.URL
improt java.net.MalformedURLException
def urlFor(path:String) =
try {
new URL(path)
} catch {
case e: MalformedURLException =>
new URL("http://www.scala-lang.org")
}
上面的代码中,返回的结果是,如果没有异常抛出,则对应 try 子句的结果,如果有异常抛出且被捕获,则对应相应的 catch 子句,如果有异常但是没有捕获的话,就没有返回结果了
匹配(match)表达式
match 表达式类似于其他语言中的 switch 语句
val firstArg = if (args.length>0) args(0) else ""
firstArg = match (
case "salt" => println("pepper")
case "chips" => println("salsa")
case _ => println("huh?")
)
在这里,需要注意的是,在 scala 中,break 是隐含在 match 中的,也就是说,scala 默认不允许从上一个备选项中跳到下一个备选项
另外,case 比较的样本不在局限于 整数类型 和 枚举常量 了
同样,match 也能产生返回值
val firstArg = if (args.length>0) args(0) else ""
val friend =
firstArg = match (
case "salt" => "pepper"
case "chips" => "salsa"
case _ => "huh?"
)
println(friend)
后记
这一章没有记录书上的挺多,一方面其在后面章节中会详细介绍,另一方面跟 Java 基本类似,也就打算先放着先,以便节省时间