您的位置:首页 > 其它

Scala坑二(控制结构和函数)

2015-11-18 10:39 267 查看
在Scala中几乎所有构造出了的语法结构都有值

1.条件表达式

不同java,Scala的if/else语法结构有值,值是跟在if或者else后面的表达式的值

if(x > 0) 1 else 0    把值赋给变量  val s = if(x >0) 1 else 0 也可以 if(x >0) s = 1 else s = 0

        if( x >0 ) "haha" else 0 混合类型表达式, (String)和(Int)公共超类型叫做 Any

表达式都有值,void 类型相当于 Unit 类 写做 ()。所有不带else的if语句等同于 if( x > 0 ) 1 else ()

2.语句终止

可以不使用分号

3.块表达式和赋值

{  }块包含一系列的表达式,结果也是一个表达式,块中最后一个表达式的值就是块的值。

如val  distanc= { val dx = x - x0 ; val dy = y - y0; sqrt(dx * dx + dy * dy)}

注意::在Scala中赋值动作本身是没有值得或者说他们的值是Unit类型 { r = r * n; n-=1}表达式的值是Unit

         同样的 x=y=-1 也是Unit类型 y=-1的值是()

4.输入输出

用print和println

5.循环

while( n > 0 ){

r = r * n;

n-=1

}

for(i <- 1 to n)

r = r * 1

for( i <- 表达式) 表示让变量 i 遍历 <- 右边的表达式的所有值

如果类型是数值 用 to ;如果类型是字符串或数组是用 until方法  i <- 0 util str.length

6.高级的for循环和for推导式

多个生成器 for(i <- 1 to 3;j <- 1 to 3)print ((10 * i +j ) + " ") 11 12 13 21 22 23 31 32 33

每个生成器带一个守卫,以if开头的Boolean表达式 for( i <- 1 to 3; j <- 1 to 3 if i != j ) print ((10 * i +j ) + " ")  12 13 21 23 31 32 if之前没有分号

任意多的定义,for( i <- 1 to 3 ; from = 4 - i; j <- from to 3) print ((10 * i +j ) + " ")  13 22 23 31 32 33

        for推导式

for循环体以yieid 开始,该循环会构造出一个集合,每次迭代生成集合中的一个值

for(i <- 1 to 10)yieid i % 3  生成 Vector(1,2,0,1,2,0,1,2,0,1)

for推导式生成的集合与它第一个生成器是类型兼容的

如 for(c< - "hello"; i<- 0 to 1)yieid (c+1).toChar 生成 "HIeflmlmop"

for( i<  - 0 t o 1;c< - "hello")yieid (c+1).toChar 生成Vector('H','I','e','f','l','m','l','m','o',p')   ;

7.函数

方法是对象进行操作的,函数不是,在java中只能用静态方法模拟函数

函数的定义,需要函数的名称,参数,和函数体

def abs(x : Double) = if (x > 0 ) x  else -x 

必须要指定所有参数的类型,如果函数不是递归的,就不需要指定返回类型

如果函数体需要多个表达式完成,可以用代码块,块中最后一个表达式的值就是函数的返回值

def fac(n : Int) = {

var r = 2

for(i <- 1 to n) r = r * 2

r //函数的值

}

对于递归函数必须指定返回值

def fac(n : Int) : Int = if (n <= 0 ) 1 else n * fac( n - 1)

8.默认参数和带名参数

def deco(str : String, left : String ="[",right="]")={ left + str + right}  调用deco("hello")得到 "[hello]" 也可以 调用 deco("hello","<<",">>") 得到 “<<hello>>”

在调用时指定参数名,顺序没有规定 deco(left="<<",str = "hello",right=">>")

9.变长参数

一个接收可变长度参数

def sum (args: Int*)= {

var reult = 0

for (arg -> args) reult +=arg

reult

}

val s = sum(1,2,3,4)

val s = sum(1 to 10:_*)    :_* 将参数序列处理

10.过程

对于没有返回值得函数,成为过程

函数体有花括号但是前面没有 = 号的,那么返回类型是Unit

def bos(s : String) {

print(s)

}

或者

def bos(s : String):Unit = {

print(s)

}

11.懒值

当val 被声明为lazy时,初始化会被推迟,直到首次对其取值

lazy val words = scala.io.Source.fromFile("...").mkString

当words被首次使用时取值

12.异常

异常机制个java差不多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: