Scala学习(基础,控制结构)

时间:2022-09-08 18:00:23

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,只有一个值,写做()
  • 如果要打印一个值,用printprintlnprintf函数
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