Scala学习(三)——代码块和流程控制

Scala学习(三)——代码块和流程控制

本站内容版权属于本人。转载须告知本人,写明出处,并在文首提供指向本站对应文章的链接。
本文链接:Scala学习(三)——代码块和流程控制
简介

如果说类和方法构成了程序的框架,那么实际完成的代码就是程序的血肉。Scala中也提供了常见的流程控制结构诸如ifforwhiledo ... while等等,但是其特性和Java相比有所不同。在本文中将会一一介绍。

基本代码块

和Java相同,基本代码块是由{}包围的语句序列。和Java不同的地方在于,Scala的基本代码块是有值的,其值为最后一个语句的值(Scala中的语句都是有值的)。比如如下程序:

引申一点:Scala中的方法写法其实是基本代码块语句的一种变体,比如按照类似Java的写法:

其实return可以省略,由代码块的最后一条语句作为返回值:

当然,大括号和返回值也可以省略:

虽然此时看上去很像一个变量,但确实是个函数,等号之后的语句只有在调用时才会执行。如果函数体很短,使用这样的写法会使程序更加简洁明了。

if语句

if语句的写法和Java中完全相同:

if语句的返回值是正确的选择支中最后一个语句的返回值:

所以if语句可以替代Java中的?:表达式,并且相对直观(不过我个人还是很钟爱?:这种简洁的写法,虽然Scala中不支持)。

while语句和do ... while语句

while语句和do ... while语句的写法和和Java中的完全相同:

这两种语句的返回值为Unit类型,相当于Java中的void类型。

for语句

Scala中的for语句和Java中完全不同,主要用于访问集合。以一个例子来说明:

也可以同时访问多个集合,效果相当于多层循环:

和以下代码等效:

for语句的实现原理是调用了集合类的foreach方法。只要一个类提供了恰当的foreach方法,其对象就可以放在<-右边进行遍历。另外,0 to 10并不是特殊语法,这一点在之后的章节会讲到。
同其他循环语句一样,for语句的返回值为Unit类型。

breakcontinuegoto

Scala中没有提供这些语句和相应的功能。实际上,Scala并不是那么提倡使用循环,而是使用尾递归的方式进行函数调用,这一点之后再讲。

match语句

match语句是Scala中提供模式匹配的重要语句。其功能类似Java中的switch,但是功能更加强大,语法更加简洁。其基本用法如下:

首先是要匹配的变量,然后是match关键字,然后是用大括号包含的case语句序列,分支条件和代码块之间用=>分隔。
没有default关键字,而是用case _替代。匹配条件时会匹配首个满足条件的case子句。
因为没有break,所以match语句不提供穿透性质。
如果要匹配多个常量,可以用|分隔,就像下面这样:

case子句除了匹配常量外,还可以匹配变量类型和提供了unapply方法的对象:

有关unapply机制,将在以后说明。
match子句的返回值是实际执行分支的返回值,类似if语句。

总结

Scala的流程控制和Java不尽相同,尤其是没有breakcontinue这种常见的语句。这也是Scala在编程思路上与Java不同的地方。如果使用得当,Scala相比Java,可以减少大量的样板代码,使程序变得更加精致。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据