Scala学习笔记-控制结构和函数(1)

云计算 waitig 348℃ 百度已收录 0评论

1. 条件表达式

 scala的if/else语法结构和Java一样。不过,在scala中if/else表达式有值,这个值就是跟在if或者else之后的表达式的值。

例如: if(x>0) 1 else -1

可以将if/else表达式的值赋给变量: val  s=if(x>0) 1 else -1

这与  if(x>0) s=1 else s=-1 效果一样。但是第一种写法可以初始化一个val。第二种写法种s必须是var

在scala中,每个表达式都有一个类型。

例如:

 if(x>0) 1 else -1的类型是Int ,因为两个分支类型都是Int

if(x>0) "positive" else -1的类型是两个分支类型的公共超类型。为Any

如果else部分缺失了,如 if(x>0) 1

那么有可能if语句没有输出值,但是在scala中,每个表达式都应该有某种值。这个问题的解决方案是引入一个Unit类,写作()。不带else的if语句等同于

if(x>0) 1 else ()

你可以把()当做是表示“无有用值”的占位符,将Unit当做Java中的void

scala没有switch语句

2. 语句终止

在scala中行尾不需要分号,同样,在}、else以及类似的位置也不必写分号,只要能够从上下文明确地判断出这里是语句的终止即可

不过,若想在单行中写下多个语句,就需要以分号隔开。例如:

if(n>0) {r=r*n;n-=1}

3.块表达式和赋值

在scala中。{}块保护一系列表达式,其结果也是一个表达式。块中最后一个表达式的值就是块的值。

这种特性对于那种对某个val的初始化需要分多步完成的情况很有用。例如,

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

{}块的值取其最后一个表达式

在scala中,赋值动作本身的值是Unit类型的,例如:{r=r*n; n-=1}的值是Unit类型的

由于赋值语句的值是Unit类型的,别把它们串接在一起

x=y=1  //no

4.输入和输出

打印一个值,一般用print或者println函数

可以用readLine函数从控制台读取一行输入,如果要读取数字、boolean或者字符,可以用readInt、readDouble、readByte、readShort、readLong、readFloat、readBoolean或者readChar。与其他方法不同,readLine带一个参数作为提示字符串:

val name=readLine("your name:")

print("your age:")

val age=readInt()

5.循环

scala拥有与Java相同的while和do循环。例如

while(n>0){

  r=r*n

  n-=1

}

Scala没有与for(初始化变量;检查变量是否满足某条件;更新变量)循环直接对应的结构。如果你需要这样的循环,有两个选择:一是使用while循环,二是使用如下for语句:

for(i<-1 to n)

r=r*i

scala 中并没有提供break或者continue语句来退出循环。需要break时,可以:

1)使用boolean型的控制变量

2)使用嵌套函数——你可以从函数当中return

3) 使用Breaks对象中的break方法:

   import scala.util.control.Breaks._

  breakable{

for(…){

if(…) break;

}

}

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

1)以变量<-表达式的形式提供多个生成器,用分号将它们隔开。例如:

 for(i<-1 to 3;j<-1 to 3) print(i+","+j)

2)每个生成器可以带一个守卫,以if开头的Boolean表达式

for(i<-1 to 3;j<-1 to 3 if i!=j) print(i+","+j)     //注意在if之前并没有分号

3)可以使用任意多的定义,引入可以在循环中使用的变量:

for(i<-1 to 3; from=4-i; j<-from to 3 )  print(i+","+j)   

4)如果for循环的循环体以yield开始,则该循环会构造出一个集合,每次迭代生成集合中的一个值

for(i<-1 to 10) yield i%3    //生成vector(1,2,0,1,2,0,1,2,0,1),这类循环叫做for推导式

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

for( c<- "hello"; i<-0 to 1)  yield(c+i).toChar   //生成“HIeflmlmop”

for(  i<-0 to 1;c<- "hello")  yield(c+i).toChar   //生成“Vector(‘H’,’e’,’l’,’l’,’o’,’I’,’f’,’m’,’m’,’p’)


本文由【waitig】发表在等英博客
本文固定链接:Scala学习笔记-控制结构和函数(1)
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)