Scala开发教程(16): 没有“break”和“continue”的日子

本文探讨Scala中循环控制的实现方式,包括如何替代break和continue语句,并介绍了使用布尔变量及递归函数的方法。

本文转自http://www.imobilebbs.com/wordpress/archives/4851,所有权利归原作者所有。

你也许注意到到目前为止,我们介绍Scala的内置的控制结构时,没有提到使用break,和continue。Scala特地没有在内置控制结构中包含break和continue是因为这两个控制结构和函数字面量有点格格不入,函数字面量我们将在后面介绍,函数字面量和其它类型字面量,比如数值字面量 4,5.6相比,他们在Scala的地位相同。
我们很清楚break,和continue在循环控制结构中的作用,Scala内置控制结构特地去掉了break和continue,是为了更好的适应函数化编程。不同你不用担心,Scala提供了多种方法来替代break和continue的作用。
一个简单的方法是使用一个if语句来代替一个continue,使用一个布尔控制量来去除一个break。比如下面的Java代码使用continue和break在循环结构中:

1 int i=0;
2 boolean foundIt=false;
3 while(i <args.length) {
4   if (args[i].startWith("-")) {
5     i=i+1;
6     continue;
7   }
8   if(args[i].endsWith(".scala")){
9     foundIt=true;
10     break;
11   }
12   i=i+1;
13  }

这段Java代码实现的功能是从一组字符串中寻找以“.scala”结尾的字符串,但跳过以“-”开头的字符串。

下面我们使用if和boolean变量,逐句将这段实现使用Scala来实现(不使用break和continue)如下:

1 var i=0
2 var foundIt=false
3 while (i < args.length && !foundIt) {
4   if (!args(i).startsWith("-")) {
5     if(args(i).endsWith(".scala"))
6       foundIt=true
7   }
8   i=i+1
9 }

可以看到,我们使用if (于前面continue条件相反)去掉了continue,而重用了foundIt布尔变量,去掉了break。
这段代码和前面Java实现非常类似,并且使用了两个var变量,使用纯函数化编程的一个方法是去掉var变量的使用,递归函数(回溯函数)的使用是通常使用的一个方法来去除循环结构中使用var变量。
使用递归函数重新实现上面代码实现的查询功能:

1 def searchFrom(i:Int) : Int =
2   if( i >= args.length) -1
3   else if (args(i).startsWith("-")) searchFrom (i+1)
4   else if (args(i).endsWith(".scala")) i
5   else searchFrom(i+1)
6  
7 val i = searchFrom(0)

在函数化编程中使用递归函数来实现循环是非常常见的一种方法,我们应用熟悉使用递归函数的用法。

如果你实在还是希望使用break,Scala在scala.util.control包中定义了break控制结构,它的实现是通过抛出异常给上级调用函数,有希望的可以参考Scala源码,下面给出使用break的一个例子,不停的从屏幕读取一个非空行,如果用户输入一个空行,则退出循环。

1 import scala.util.control.Breaks._
2 import java.io._
3  
4 val in = new BufferedReader(new InputStreamReader(System.in))
5  
6 breakable {
7   while(true) {
8     println("? ")
9     if(in.readLine()==""break
10   }
11 }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值