Scala学习笔记(1)

主要根据Scala for the impatient一书。不在这里介绍如何安装Scala,如何编译Scala等问题。

1.1 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.

1.2 声明值(value)和变量(variable)

valvar的区别在于,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中在不需要改变值时,推荐使用valvar在定义时,不需要声明其类型,类型可以根据初始化的表达式自动推断出来。也可以显式地定义类型,与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中这样定义,会将xy都赋值为100。

1.3 常用类型

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方法(求交集)。StringOpsString增加了100多种方法。类似的类还有RichInt, RichDouble, RichChar等。

在Scala中,使用方法而不是强制转换来进行数值类型的转换。比如,99.44.toInt得到99。java里的强制转换,则类似于(int)a

1.4 算术符号和操作重载

Scala中的+ - * / % & | ^ >> <<操作符与一般编程语言一致。特别的一点在于,Scala中这些操作符实际上都是方法。

scala> 7+7
res8: Int = 14
scala> 7.+(7)
res9: Int = 14

a+ba.+(b)实际上是一样的。scala中支持将符号作为方法名,如BigInt中有一个方法/%,返回商和余数的二元组。任何一个有两个参数的方法(一个显式参数,一个隐式参数),都可以写成两种形式:a method b或者a.method(b)

Scala中没有++--操作,需要用+=1或者-=1

1.5 调用函数或方法

Scala中采用singleton objects单例对象实现了java中static methods静态方法的功能。在import scala.math._(这里,_相当于通配符*)之后,只需要直接sqrt(2)pow(2, 4)就可以调用数学函数。一个类经常有一个companion object伴生对象,它的方法与java中的静态方法类似。

scala> "Hello".distinct
res11: String = Helo

没有参数的方法,在调用时可以去掉括号。

1.6 apply方法

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")BigIntapply方法,将字符串或者数字转为了BigInt对象。

你可能感兴趣的:(scala)