首页 > 代码库 > 再拾Scala
再拾Scala
Scala 运行于JVM之上,拥有海量类库和工具,兼顾函数式编程和面向对象。
在Scala中, 解释器就是我们喜欢的REPL,变量或者函数的类型总是写在变量或函数的后面(与java相反),数值类型的转换通过方法而不是强制类型转换,仅当同一行代码存在多条语句时才需要用分号隔开。
scala 允许自定义操作符,注意有分寸地使用,在使用scala.开头的包时,可以省去scala前缀。scala没有静态方法,类似的特性可以用单例对象,一个类对应的companion object就跟Java中的静态方法一样,使用companion object的apply方法是scala中构建对象的常用方法。
控制
在scala中,判断语句跟其他语言类似,但{}块包含一系列表达式,其结果也是一个表达式,块中最后一个表达式的值就是块的值。
在for 循环的变量之前并没有val或var的指定。该变量的类型是集合的元素类型,循环变量的作用域一直持续到循环结束。scala并没有提供break或continue语句来退出循环,替代方法如下: 1)使用Boolean的控制变量 2)使用嵌套函数——在函数中return 3)使用Breaks对象中的break方法,控制权的转移是通过抛出和捕获异常完成的,出于性能考虑,尽量避免这一机制。
for有丰富的形态,可以提供多个生成器,并带有if开头的表达式,还可以使用任意多的循环变量定义。
函数
scala中的方法对对象进行操作,而函数不是,C++中也有函数,不过在Java中智能用静态方法模拟,scala的函数不需要return,对应递归函数必须指明返回类型,可以混用未命名参数和带名参数,只要那些未命名的参数是排在前面的即可。
同样,变长参数列表很方便,通过 :_* 将值序列转换成参数序列。当变长参数类型为Object的Java方法时,需要手工对基本类型进行转换。
scala对不返回值的函数有特殊的表示法,如果函数体包含在花括号当中但没有前面的=号,那么返回类型就是Unit,这样的函数也叫过程函数。
当val 被声明为lazy时,它的初始化将被延迟加载,直到对它初次取值。每次访问延迟加载的变量,都会有一个方法被调用,以线程安全的方式检查该值是否已被初始化。
异常
scala异常的工作机制和Java或C++一样,但没有"受检"异常,捕获异常采用模式匹配的语法,不需要使用捕获的异常对象,可以用_来替代变量名。try/catch和try/finally是互补的。
再拾Scala