Scala基础

变量、基础数据类型

Scala中变量不需要显示指定类型,但需要提前声明。这可以避免很多命名空间污染问题。Scala有一个很强大的类型自动推导功能,它可以根据右值及上下文自动推导出变量的类型。你可以通过如下方式来直接声明并赋值。

scala> val a = 1
a: Int = 1

scala> val b = true
b: Boolean = true

scala> val c = 1.0
c: Double = 1.0

scala> val a = 30 + "岁"
a: String = 30岁

Immutable

(注:函数式编程有一个很重要的特性:不可变性。Scala中除了变量的不可变性,它还定义了一套不可变集合scala.collection.immutable._。)

val代表这是一个final variable,它是一个常量。定义后就不可以改变,相应的,使用var定义的就是平常所见的变量了,是可以改变的。从终端的打印可以看出,Scala从右值自动推导出了变量的类型。Scala可以如动态语言似的编写代码,但又有静态语言的编译时检查。这对于Java中冗长、重复的类型声明来说是一种很好的进步。

(注:在REPL中,val变量是可以重新赋值的,这是`REPL`的特性。在平常的代码中是不可以的。)

基础数据类型

Scala中基础数据类型有:Byte、Short、Int、Long、Float、Double,Boolean,Char、String。和Java不同的是,Scala中没在区分原生类型和装箱类型,如:intInteger。它统一抽象成Int类型,这样在Scala中所有类型都是对象了。编译器在编译时将自动决定使用原生类型还是装箱类型。

字符串

Scala中的字符串有3种。

  • 分别是普通字符串,它的特性和Java字符串一至。
  • 连线3个双引号在Scala中也有特殊含义,它代表被包裹的内容是原始字符串,可以不需要字符转码。这一特性在定义正则表达式时很有优势。
  • 还有一种被称为“字符串插值”的字符串,他可以直接引用上下文中的变量,并把结果插入字符串中。
scala> val c2 = '杨'
c2: Char = 杨

scala> val s1 = "羊八井花园"
s1: String = 羊八井花园

scala> val s2 = s"羊八井花园${c2}景"
s2: String = 羊八井花园

scala> val s3 = s"""羊八井花园"工程师"\n${c2}景是江津人"""
s3: String =
羊八井花园"工程师"
杨景是江津人

运算符和命名

Scala中的运算符其实是定义在对象上的方法(函数),你看到的诸如:3 + 2其实是这样子的:3.+(2)+符号是定义在Int对象上的一个方法。支持和Java一至的运算符(方法):

(注:在Scala中,方法前的.号和方法两边的小括号在不引起歧义的情况下是可以省略的。这样我们就可以定义出很优美的DSL

  • ==!=:比较运算
  • !|&^:逻辑运算
  • >><<:位运算

注意

在Scala中,修正了(算更符合一般人的常规理解吧)==!=运算符的含义。在Scala中,==!=是执行对象的值比较,相当于Java中的equals方法(实际上编译器在编译时也是这么做的)。而对象的引用比较需要使用eqne两个方法来实现。