scala 入门(5) -- 內建控制结构


根本你以为婚姻就是长期的卖淫 —— 倾城之恋


参考

《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 基本类似,也就打算先放着先,以便节省时间


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值