首页 > 代码库 > Scala基础

Scala基础

REPL

    在Scala中的书籍中会提及REPL,REPL(Read-Eval-Print Loop);这被称为“读取-求值-打印”循环。
    不带参数的Scala方法通常不使用圆括号,例如,StringOps类的API显示它有一个distinct方法,不带(),其作用是获取字符串中不重复的字符。调用如下: print("hello".distinct);

Scaladoc

    阅读Scaladoc的一些小窍门:
  1. 如果想使用数值类型,记得看看RichInt、RichDouble等,如果想使用字符串,记得看看StringOps
  2. 那些数学函数位于scala.math包中,而不是位于某个类中
  3. 标记为implicit的方法对应的是自动(隐式)转换
  4. 方法可以以函数作为参数

语句块

注意:在Scala中,表达式(如3+4)和语句(如if-else语句)一样都有值,几乎所有构造出来的语法结构都有值。
在Scala中,{ }块包含一系列表达式,其结果也是一系列表达式。块中最后一个表达式的值就是块的值。赋值动作本身是没有值的,它们的值是Unit类型,而这个类型只有一个值就是()。比如:{r = r * n; n -= 1}的值是Unit类型的。

for循环

for(i <- 表达式),让变量i遍历<-右边的表达式的所有值,在for循环的变量之前并没有val或var的指定,该变量的类型是集合的元素类型,循环变量的作用域一直持续到循环结束。遍历字符串或数组时,你通常需要从0到n-1的区间,这个时候可以使用until方法而不是to方法,until返回一个并不包含上限的区间。
说明:在Scala中,并没有提供break和continue语句退出循环,如果需要break时,可以使用Breaks对象中的break方法。还可以使用变量表达式的形式提供多个生成器,用分号将它们隔开,例如:
 for (i <- 1 to 3; j <- 1 to 3) {
      print(10 * i + j + " ")
    }
//打印结果:11 12 13 21 22 23 31 32 33  
如果for循环的循环体以yield开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值: for (i <- 1 to 10) {   yield i % 3  }//生成vector{1,2,0,1,2,0,1,2,0,1},这类循环叫做for推导式。for推导式生成的集合与它的第一个生成器是类型兼容的。

函数

Scala除了方法外还支持函数,方法对对象进行操作,函数不是。函数: def abs(x: Double) = if (x > 0) 1 else 0;只要函数不是递归的,你就不需要指定返回类型,若是递归函数,必须指定返回类型,如def fac(n:Int):Int = if (n<=0) 1 else fac(n-1)*n;。

过程

Scala对于不返回值的函数有特殊的表示法。如果函数体包含在花括号当中但没有前面的=号,那么返回类型就是Unit,这样的函数被称为过程。过程不返回值,我们调用它仅仅是为了它的副作用。

懒值

当val被声明为lazy时,它的初始化将被推迟,直到我们首次对它取值。
    val words = scala.io.Source.fromFile("words").mkString;//在words被定义时即被取值
    lazy val words = scala.io.Source.fromFile("words").mkString;//在words被首次使用时取值
    def words = scala.io.Source.fromFile("words").mkString;//在每一次words被使用时取值
说明:懒值并不是没有额外开销。每次访问懒值,都会有一个方法被调用,而这个方法将会以线程安全的方式检查该值是否已被初始化。