1. 基础
- 以val定义的值是常量
val a = 0 //a的值是不可变的
- 以var定义的值是变量
var b = 0 //b的值是可变的
- 不需要给出值或变量的类型,这个信息可以从你用来初始化它得表达式推断出来,声明值或变量但不做初始化会报错
- 在Scala中,变量或者函数的类型总是写在变量或者函数的后面
val c: String = "hello"
- scala的7中数值类型:Byte,Char,Short,Int,Long,Float和Double。这些类型是类
- scala没有提供
++
和--
操作符,我们需要使用+=1
或者-=1
d += 1 //将d递增
- Scala提供函数,使用数学函数很简单
sqrt(2) //求开方
pow(2,4) //求2的4次方
min(3,Pi) //求3和Pi那个小
数学函数是在scala.math
包中定义的,使用数学函数时需要引入该包
import scala.math._
- 不带参数的Scala方法通常不使用圆括号
2. 控制结构和函数
- 在Scala中if/else表达式是有值的,这个值就是跟在if或else之后的表达式的值。可以将if/else表达式的值赋给变量
val e = if(x > 0) 1 else -1
- 在Scala中每个表达式都应该有某种值。if/else表达式如果else部分缺失,就可能没有输出值,解决方案就是引入一个Unit类,写作
()
,不带else的if语句等同于
if(x > 0) 1 else ()
- 在if/else表达式中,如果一个分支类型是Nothing,那么表达式的类型就是另一个分支的类型
- 在Scala shell中粘贴成块代码时,键入
:paste
,把代码粘贴进去,然后按下Ctrl+D - 在Scala中,
{}
块中包含了一系列的表达式,其结果也是一个表达式,块中最后一个表达式的值就是块的值 - Unit类型等同于Java和C++中的void,只有一个值,写做
()
- 如果要打印一个值,用
print
,println
或printf
函数
print("f")
println(42)
printf("hello, %s.You are %d years old.", "Fred", 42)
- for语句:
for(i <- 表达式)
for (i <- 1 to n)
r = r + 1
1 to n
:返回1到n(含)的Range。until方法返回一个并不包含上限的区间。
- 高阶for循环
以变量 <- 表达式的形式提供多个生成器
for (i <- 1 to 3; j <- -1 to 3) print((10 * i + j) + " ")
每个生成器都可以带一个守卫,以if开头的Boolean表达式
for (i <- 1 to 3; j <- -1 to 3 if i != j) print((10 * i + j) + " ")
if之前没有分号
可以在循环中使用变量
for (i <- 1 to 3; from = 4 - i; j <- from to 3 ) print((10 * i + j) + " ")
如果for循环的循环体以yield开始,则该循环会构造出一个集合
for (i <- 1 to 10) yield i%3 //生成Vector(1,2,0,1,2,0,1,2,0,1)
- 定义函数时,需要给出函数的名称,参数和函数体
def abs(x : double) = if (x >= 0 ) x else -x
只要函数不是递归的,就不需要指定返回类型,对于递归函数,我们必须指定返回类型
def fac(n : int) : Int = if(n <= 0) 1 else n * fac(n - 1)
- 如果函数体包含在花括号当中但没有前面的=好,那么返回的类型就是Unit,这样的函数被称作过程
def box(s: String) {
...
}
- throw表达式的内容是Nothing