00:00
最后我们再来介绍一下在skyla当中怎么样实现循环的中断,我们都知道在Java里边如果想要跳过当前轮次的循环的话,那使用的是continue,那如果想要跳出整个循环,退出整个循环的话,那就要使用break。所以在Java里边我们是使用了两个关键字来实现循环中断的功能的,那对于scla而言呢,我们是希望能够设计一个函数式编程的语言,另外呢,我们希望它是完全面对对象的,所以SC拉的内置控制结构是去掉了break和CONTINUE2个关键字的,大家会发现没有这两个关键字,那我们怎么样去解决它呢?它一定要有相应的替代方案啊。啊,对于continue我们已经比较熟悉了,前边我们讲到for循环的时候,我们可以在for循环当中引入一个循环守位,那么对于想要跳过想要continue的那些那些内容,我们直接呃,就是在循环守位里边把它过滤掉就完事了,那假如说是想先要做一些操作,然后再continue的话,那其实我们也可以直接用这个条件判断啊,If else直接把它处理掉,所以这个是完全没有问题的。那至于break想要退出整个循环,那应该又要做什么样的一个操作呢?
01:20
哎,这个可能稍微会麻烦一点,那我们可以有这样的一个思路,就是如果要是想要退出整个循环的话。这看看起来就完全是一个中断嘛,哎,那什么样的操作什么样的呃,程序流程可以直接打断当前的程序直接中断呢。我们自然想到了异常,如果要是抛出异常的话。那当前的程序就直接退出就中断啊,所以其实在Java里边我们也可以用抛出异常的手段方式去实现类似于break的功能,所以接下来我们首先基于Java给大家做一个具体的分析啊。
02:00
我们在Java目录package下边去新建一个Java的class啊,那接下来我们主要是test test这个功能啊。好,把这个方法先写出来,首先最常见的方法我们还是用break先给大家实现一遍啊,Int I等于零,I小于。五比方说或者小于十啊,这个随便我们少一点吧,小于5I加加。然后假如说我们的要求是当A等于三的时候,我们当前就要直接退出所有的循环,那如果要是这样一个条件的话,非常简单,就是if I等于三,直接break啊,那如果else的话,那可能比方说我们不输当前的爱,这是完全可以做到的。直接运行一下。大家可以看到没有问题,012到三的时候就直接退出了啊,对吧?啊,当然我们外面也可以再点1.1句啊,我们说这是循环外的啊,我们运行的时候就能明确的看出来,到三之后我们就跳到外边执行了循环外的代码,看的非常的明确,那如果说我们不使用break关键字,那能不能用异常的抛出异常的方式来把它做一个处理呢?哎,其实是可以的,就是我们当前这个for循环,那就要直接包装在一个一个try catch里边了,对吧?哎,就是当前我们是要一个串,然后下边呢去做一个catch里边,我们可能是需要抛出异常的,因为如果你直接抛出异常,在break这个地方直接抛出异常的话。
03:51
那我们整个代码就就会直接直接退出,异常退出,所以如果说我们可以在这儿直接把它接住的话,把它处理掉的话,那当然相当于我们就不会退出了,那现在其实我们接住也不用做任何处理,啥都不做,那接下来是不是就可以直接调用这个循环外的代码了,哎,所以相当于我们这里什么都不做,就是退出循环,那比方说这里边我们做一个肉,你有一个随便啊,比方说runtime exception。
04:21
那接下来的时候,我们直接catch一个exception e,然后接下来什么都不做,对吧,什么不做。只是退出循环,这样的话其实也能实现类似的功能,哎,我们可以运行一下,大家看看运行的效果是不是跟刚才一样,大家看是一模一样的,哎,所以我们使用抛出异常,然后再catch到catch到它什么都不做的这种方式,其实就可以实现break的功能,所以这样看的话,那其实break这个关键字就完全没有必要了啊,所以接下来我们在skyla里边同样可以用这种方法去做一个对应的实现,那接下来我们新建一个。
05:06
SC的object s06,我们主要是要测试break,把倍方法先写写出来啊,那所以接下来我们要做的就是采用凹出异常方式退出循环,那这里边当然我们也是要做一个try catch了,Tla里边同样有try catch这样的关键字啊,那所以目前我们这个做法,哎,写一个哦,推导式啊,那刚才我们是从从零到四啊,那现在我们干脆啊也是从零到零到四吧,0NQ5,这就是不包含五对吧?啊,就是零到四的意思啊,然后里边怎么样去做处理呢?啊,那就是如果要是if当前的I等于三的话,我们这里边。
06:07
都要去throw样,还是又一个runtime exception,大家看跟那个Java里面的代码基本上是逻辑完全一致啊啊,然后我们print line I,如果要不是的话,刚才的I,那接下来要做一个catch了。Catch这里边的话,语法跟话里边会有所不同,二里边我们是把这个exception作为catch的一个参数啊,类似于参数一样捕获到的,而而这个在skyla的语法里边呢,Catch是代码块里边,然后去判断当前的这个exception到底是什么样的,它用的是模式匹配啊,就是前面我们提到的啊,呃,做这个多条件分支的时候可以用模式匹配,而这里边呢,也可以用模式匹配,所以它下来是一个case语句,当前的case,第一个前的这一个异常啊,Exception接下来是什么呢?同样还是什么都不做,只是退出循环。
07:11
只是语法细节有所不同,整体的逻辑Java里边的实现还是一模一样的啊,那最后我们这里可以打印句或是循环Y代啊,所以整体来讲的话,之前的这个Java实现。只要我们有这个抛出异常的思路,那这个实现就是几乎完全一样。这样就实现了break的功能,当然了,大家会发现你这样去写的话,呃,那skyla代码就没那么简单了,对吧?你这尽管是省了一个关键字,但是你又是抛异常,又是try catch,还涉及到这个奇奇怪怪的一些语法,这明显不如一个关键字break来的方便啊啊,那能不能简化一些呢?诶,当然是可以的,所以为了简化,在skyla里边我们可以。
08:07
只用skyla。风的break。类的break方法。直线异常的。捕凹出和捕捉。哎,所以就相当于我们在scla里边呢,根本有一个类,把这些方法做了一个包装,然后接下来我们就相当于是调用类里边的某一个方法就可以实现对应的功能了,哎,所以大家看这不就是我们所说的要更加的面对对象,要更加的啊函数式编程嘛,对吧,就不要用一个关键字去直接打乱我们的程序结构,而是把它都包装成了方法调用啊,那这里边当然就是要引入所谓的这个X类,大家看是在GALA until control这个包下边的一个类。
09:12
啊,那接下来这个try try catch啊,大家看到是抛异常的时候,我要调它的break方法,那外面这个try catch又用什么来定义呢?是必须要标记一下,在外面标记一下当前循环是可中断的,那所以就必须要有一个X,看一个breakable,用这个方法你就表示接下来的代码是可中断的,要抛出异常的,哎,那中间呢。当然就还是这个for循环的这个主体内容了,是啊,在这里边于三的时候出异常抛出异常的话,不要直接去throw exception了,而是调用breaks下边的看有一个break方法,要这样做就可以了。啊啊,那这个运行一下,大家会发现这个代码的结果啊,还是一样的012循环外的代码。
10:03
那如果大家仔细的点到这个源码里边的话,其实会发现啊,Breaks下边的这个breakable方法,其实里边就是一个try catch对吧,那其实就是把我们这个前面写的这个try catch代码做了一个包装而已啊,而对应的。x.break方法呢,看这里边其实就是throw了一个exception对吧,而且你看到它的返回类型就是nothing,因为抛出异常了嘛,这里边并不会正常的返回结果它的类型就是nothing啊,所以整体来讲,其实就是用了一个抛出异常的方法,解决了退出循环的这样的一个功能,Break的功能就实现了。啊,当然如果有同学认为这样的写法还是有一点复杂的话啊,那它还可以进一步简化,大家会发现前边我们在做这个引入的时候呢,其实是直接引入了breaks这个类,哎,那我们还可以怎么做呢?还可以直接我把它直接copy一下啊,还可以直接点,然后接下来一个下划线。
11:08
表示什么呢?有点像二里边的一个类,然后点星号把所有的内容都引入的这个,呃,方式我们这里边也是一样,这就相当于把breaks这个类下边的所有属性和方法都直接引入进来了,那接下来大家就想到了,我就不需要通过breaks去做调用了,那可以怎么样呢?我是不是直接就到这个breakable就可以了,然后接下来是不是直接这里也是直接break就可以了啊,所以相对于把里边的break关键字的话,这里边就变成了一个方法调用,只是多了一个标记而已,对吧,用了一个breakable做了一个标记而已,所以这样的话就可以啊做到了这个最简单,比之前的break关键字也没有复杂太多,这就是关于SC当中退出循环实现break功能的这样的一个用法。
我来说两句