00:00
最后我们来给大家介绍一下循环的返回值啊,这个内容也是比较有特色,之前大家会发现啊,在scla代码里边,其实每一个代码块,每一个语句其实都是有返回值的,甚至连条件分支里边的if它也是有返回值的,那在if else里边呢,我们是说每一个代码块的最后一行代码那个表达式的值就是当前代码块的返回值,然后我们综合每一个分支它们的那个返回值,最后取他们的公共负类,就是当前返回值的类型,那对于循环来讲是不是也是这样呢?是不是最后一行代码的表达式的值就是当前的返回值呢?接下来我们在代码里边做一个简单的测试啊,那接下来我们还是回到T02POLOP这个测试文件里边。第七部分。测试的是循环返回值啊,那首先我们还是写一个最简单的循环for I,从一到十里边直接print line I,哎,那其实大家会想到啊,当前如果要是直接拟一个变量。
01:18
接收它的这个返,假如它有返回值的啊,我们定义一个变量去接收它的值的话,我们能想到如果有的话也肯定是空,对不对啊,因为当前的这一个表达式里边print line,本来这个就应该是返回,是一个unit嘛,哎,所以我们自然能想到啊,你可以用一个利用一个idea里面的快捷方式,你看一段这个表达式后边点Y,我们就可以选中一段代码,这个可以选择范围啊,选中一段代码,然后去创建对应的。它付给对应的一个变量,碰见这样的一个变量啊,那这里我们可以直接specify type,把这个勾选上的话,就可以看到编译器自动为我们推断出来的当前变量的类型,我们看到当前自动推断的话,它的类型就是一个unit啊,那所以比方说我们把它叫做A,接下来print line。
02:11
A的值。打印出来的话,那当然unit里边只有一个对象实例,就是空括号,这个是完全没有问题的,哎,那自然我们就想到了,那要这么说的话,是不是我这里边直接给一个I放在这里,或者我直接给一个string啊,就是我给一个hello对吧,在这里接下来它返回值就变成了string了呢。啊,其实大家会发现这好像有点不太一样啊,跟if的时候不太一样,因为if else的时候,如果我最后一行变成一个string的话,你这里外边返回值给unit,这里面就啊,就是本身你相当于是指定强行指定它是unit了,对吧?哎,那这里边如果我给一个string可以吗?
03:01
这是不对的,里边推断本身得到的返回值还是unit,我们强行给了他string,这就有问题了。如果大家不给这一个当前的类型直接定义出来,让编译器自动推断的话,我们直接打印,其实也能打印看到它的纸。大家看到还是空的。啊,那如果说这里边我们直接把这个定义成I一个一个int类型的话,其实会看的更加的明显,因为大家想到啊,这里边我们for循环里边的代码是要执行多次的,如果它要返回的话,是不是也要返回多次啊,那你这里边如果说它本身是int类型A就要定义成一个int类型的话,那你这个int到底是取一还是取十呢?还是取中间的某一个值呢?哎,所以这里边我们是没有办法去定义出来的,所以在scale拉里边for循环默认情况下,它的返回值都是空,它的类型都是unit啊,所以在这里我们可以给这样的一个结论,那是不是对于这个scale拉里边的for循环而言,就没有任何情况它能够返回一个值呢?啊,其实也不是的,在特殊的情况下,我们可以怎么样呢?可以利用特别的一些关键字啊,特别的一些语法,然后让每一个I这里边我们遍历这个范围,或者遍历一个集合取出来的每一个I,做一些操作之后得到的结果呢?
04:29
放到一个集合里边啊,因为大家想你当前I不是它可以从一个集合或者从一个范围里边取很多个出来吗?那取很多个出来,我经过一个转换,经过一个计算之后,得到的也应该是很多个,是一个集合,那所以如果我能保存成一个集合的话,我当然可以得到一个新的返回值。所以接下来我们就看一下这样的一个语法到底怎么样去实现。把这个直接copy一下,现在我们新定义一个,接下来如果想要实现这样的一个集合类型的话,我不是直接这么简单的实现这个集合体,呃,后面的这个循环体了,而是要用一个新的关键字叫做Y。
05:13
I的这个关键字,大家可能之前在Java里边也见过啊,它里边是在线程里边有一个方法叫做I,它是表示线程让步的,Skyla里边的I呢,它不是方法,这就是一个关键字,这个关键字它的含义也跟线程一点关系都没有,它表示的呢就是要在当前for循环里边生成一个。集合类型作为返回值返回啊,那所以比方说啊,我当前要把每一个I,如果放到一个集合里边的话,那就直接I后边跟什么呢?跟着就是当前你要放的那个。结果的元素,比方说我要放的就是I的值,那就的I。那当前的这个就应该是什么类型呢?可以点吧选中看一下。
06:01
大家可以看到它的类型是一个index的S,然后int它有泛型,其实前面我们也已经看到了啊呃,之前的那个range不也是一个abstracted的abstract seek吗?也是一个序列吗?那当前这个index seek也是一个序列,所以这是一个集合类型,SC里边的集合类型。那当前我们就是生成了一个新的集合啊,那所以我可以把这个去掉啊,然后接下来我看一下这个到底是个什么东西。运行一下。诶,大家可以看到B得到的是一个集合,这个集合是一个vector。VE是一个向量对吧?哎,这是一个向量类啊,然后里边的元素就是我们当时遍历的每一个I,它把每一个I拿出来生成了一个新的集合类型,生成了一个向量,哎,那这里边前面我们推断的时候,它不是应该是一个index的S吗?怎么这里边又变成了一个向量呢?
07:01
哎,这里边要给大家稍微的解释一下啊,我们可以看到啊,我们可以先把前面的这个集合类型先出来。比方说我们把它就叫做B。然后后边。需要去实现的是一个index对吧,是这样的一个类型啊,当然前面还应该有这个,前面我们综合直接把它这个推断出来的时候。是imutable下边的index seek,那这个大家要注意一下啊,就是不同的包里边它会有不同的定义,那么如果大家这么定义的话,你会看到index seek并不是一个具体的类。它是一个treat,它是一个scale里边的特征,Treat叫特征,那么这个treat特征其实是类似于Java里边的接口interface的啊,所以这里边它还需要有具体的实现,那它的具体实现又是什么样的呢?诶,你可以看到下面它同样也有伴生对象的,也有object的,而在这个object里边呢,你看到它有一个new builder,它有一个构造方法,那么这个builder里边调的直接就是veor的new builder对吧?啊,所以当前创建出来的默认实现就是用了一个vector实现了这样一个index seek。
08:29
所以我们这里边你看到最终输出的啊,它的实现是一个vector,这是关于生成。呃,生成一个集合类型作为for循环返回值的这样的一个解释,那当然它具体来讲又有什么用呢?其实大家也发现了,它的用法其实非常的强大啊,嗯,我们这里是直接把这个I打印输出了,那假如说我要把I每一个I都乘以二和一个打印输出是不是也可以啊,这样一输出的话,大家看到就是原先是一到十,现在就是2468~20了,甚至我还可以有些其他的计算,我要输出每一个数的平方是不是也可以啊,那接下来我输出的就都是平方数了,所以按照这个想法的话,我是不是就相当于对于之前的这个这个这是对于这个集合这个范围啊,那如果说我这里边是一个。
09:22
是一个数组,是一个列表,是一个序列,是一个呃,集合任意的集合类型,那是不是就相当于我可以对这个集合类型里边的每一个元素做对应的一个。计算处理啊啊,所以就相当于直接针对集合做了一个操作,做了一个转换啊,所以在后边我们讲到集合类型的时候,会发现它非常的好用,而且这种转换可以在哪些场景下会应用更加广泛呢?大家想想我们的大数据是不是做的就是这样的一个操作啊,数据量很大,我们就可以可以把它看成一个集合嘛,那么这个集合我们往往都是对针对里边的元素是要做同样的操作,那是不是直接做这样的一个操作就可以实现呢?
10:07
哎,所以大家看到SC的这种语法设计天生就是。对于大数据更加的方便,更加的好用啊,这就是关于for循环的返回值的用法。
我来说两句