主要根据Scala for the impatient一书。不在这里介绍如何安装Scala,如何编译Scala等问题。
直接输入算式后回车,解释器中就会显示结果:
Scala> 8*5+2
res0: Int = 42
Scala>
后面是输入的算式,第二行是输出的结果。解释器给了结果一个名字res0
,结果的类型Int
也被展示了出来。res0
可以直接用于后续的计算:
Scala> res0 * 2
res1: Int = 84
解释器一般支持tab
补全的操作,如下的调用res2.toUpperCase
可以将res2
中的字母都变为大写。这里toUpperCase
后面的括号可加也可不加,Scala中没有参数的方法的括号是可以省略的。
Scala> "Hello, " + res0
res2: String = Hello, 42
Scala> res2.toUpperCase
res3: String = HELLO, 42
The Scala interpreter reads an expression, evaluates it, prints it, and reads the next expression. This is called the read-eval-print loop, or REPL.
val
与var
的区别在于,val
在定义之后就不可以修改,相当于常量;var
定义之后,它的值还可以修改。
Scala> val ans = 7 + 7
ans: Int = 14
Scala> ans = 0
:11: error: reassignment to val
ans = 0
^
Scala> var cnt = 0
cnt: Int = 0
Scala> cnt = 7
cnt: Int = 7
Scala> cnt = 1.1
;:11: error: type mismatch;
found : Double(1.1)
required: Int
cnt = 1.1
^
Scala中在不需要改变值时,推荐使用val
。var
在定义时,不需要声明其类型,类型可以根据初始化的表达式自动推断出来。也可以显式地定义类型,与java等语言中不同,类型是写在变量名后面的:
Scala> var greeting : String = "Hello"
greeting: String = Hello
可以同时定义多个变量:
Scala> var x, y = 100
x: Int = 100
y: Int = 100
这里与C++里,int x, y = 100
不一样。Scala中这样定义,会将x
和y
都赋值为100。
Scala中有7个数值类型,Byte, Char, Short, Int, Long, Float, Double, Boolean
。与java中的不一样,Scala中这几个类型都是类(classes
),Scala中没有基本类型。
Scala中可以直接对数字调用方法。
Scala> 1.toString
res6: String = 1
Scala提供了额外的一些类,增加了java里String等类的能力。
Scala> "Hello".intersect("World")
res7: String = lo
对于Hello
这个字符串对象,Scala在处理中先将其转换为StringOps
对象,然后再调用它的intersect
方法(求交集)。StringOps
比String
增加了100多种方法。类似的类还有RichInt, RichDouble, RichChar
等。
在Scala中,使用方法而不是强制转换来进行数值类型的转换。比如,99.44.toInt得到99。java里的强制转换,则类似于(int)a
。
Scala中的+ - * / % & | ^ >> <<
操作符与一般编程语言一致。特别的一点在于,Scala中这些操作符实际上都是方法。
scala> 7+7
res8: Int = 14
scala> 7.+(7)
res9: Int = 14
a+b
与a.+(b)
实际上是一样的。scala中支持将符号作为方法名,如BigInt
中有一个方法/%
,返回商和余数的二元组。任何一个有两个参数的方法(一个显式参数,一个隐式参数),都可以写成两种形式:a method b
或者a.method(b)
。
Scala中没有++
和--
操作,需要用+=1
或者-=1
。
Scala中采用singleton objects
单例对象实现了java中static methods
静态方法的功能。在import scala.math._
(这里,_相当于通配符*)之后,只需要直接sqrt(2)
、pow(2, 4)
就可以调用数学函数。一个类经常有一个companion object
伴生对象,它的方法与java中的静态方法类似。
scala> "Hello".distinct
res11: String = Helo
没有参数的方法,在调用时可以去掉括号。
scala> "Hello"(4)
res12: Char = o
"Hello"(4)
实际是对"Hello".apply(4)
的简写,StringOps
中有一个方法def apply(n: Int): Char
。可以认为是对()
操作符的重载。
scala> Array(1, 4, 9, 16)
res13: Array[Int] = Array(1, 4, 9, 16)
这里实际是调用了Array``companion object
伴生对象的apply
方法。利用伴生对象的apply
方法,可以构造对象。BigInt("1234567890")
,BigInt
的apply
方法,将字符串或者数字转为了BigInt
对象。