00:00
接下来我们再来介绍另外一个scla当中比较有意思的用法,就是所谓的惰性加载啊,那它主要说的是什么呢?他说的是有一个关键字,在scda里面有一个关键字叫做lazy啊,如果说我们把一个函数的返回值赋值给一个变量,然后呢又被声明为lazy的时候,这个时候函数的调用执行就会被推迟。那什么时候到它才会执行呢?啊,那就是直到我们想要第一次用这个变量这个值的时候,这个函数才会被调用执行。啊,所以整体来看的话,就相当于我们这个函数有点懒,我们执行的过程呢,就是一定要等到它要去用到的时候才去做加载,才去做调用计算执行,所以这样的函数我们就叫做惰性函数,这样的加载方式呢,我们就叫做惰性加载啊,所以有时候因为它是lazy关键字嘛,有时候我们也直接把它叫做懒加载,在往往在SKY里边,我们经常会用到这样的一种特性啊,那其实大家会发现了,懒加载的这种方式呢,其实本质上跟我们前面介绍的控制抽抽象其实是一个概念,它其实就类似于是把我们当前的这个变量啊定义成了一个。
01:21
相当于一个传名参数一样的东西,只不过我们在这里边,它并不是作为一个函数的参数出现的,它就是作为一个变量出现的啊,那它比方说后面我们要执行一段代码,执行一个函数,那所有的这一段,我们就相当于是把这个完整的代码传递给了后面使用的那些地方啊,这就是所谓的懒加载,惰性加载。接下来我们在代码里边做一个简单的测试。还是新建一个SC的object,那我们现在要测的是TEST13。懒加载lazy把方法写出来,那接下来首先我们还是用lazy去做一个声明,一个定义,看有这样一个关键字啊,定义这样一个。
02:09
结果变量叫做result,它是一个int类型的值,然后这里边呢,啊,我们就用这个例子啊,要用两处去求和,做一个sum自定义这样一个sum函数,比方说给一个13。47,然后接下来呢,我们在他执行这一句声明啊,完成之后,后边再去定义一个print line,我们在打印输出一句话,就说这个是一。里边我们说。函数函数,哎哟,然后最后我们再输出一句,这个叫2RESULT,把这个值做一个打印输出,当然了我们还得定义这样的一个。
03:01
看函数边需要有两个呃,两个参数啊,一个A,一个B,然后简单的做一个叠加就完了,其中返回的得到的还是一个int值,这边我们需要的就是A加B,为了让大家看清楚执行顺序,我们在这儿再打印一行,当前是3SOME好友。那大家可以想象一下啊,这样的一个简单的代码,我们如果要运行的话,123的输出顺序应该是什么样子呢?有同学可能会想了,这个太简单了,你这样的话不就是先调用这个sum吗?我们先输出三,然后接下来输出一,然后再输出二,是这样的吗?我们可以运行一下看看结果。大家看到并不是我们想象当中的312,它的调用顺序有点奇怪,它的调用顺序是132,那甚至他也不是123,这里边是132,为什么是这样呢?
04:03
我们来给大家解释一下,这就是因为我们用用到了lazy这个关键字,它表示当前的这个sum函数。它的求值这个过程变成了一个懒加载的过程,呃,所以说当前我们定义的这个result这个变量啊,大家可以认为它就相当于是一个传名参数,相当于是把后边的这尽管我们这里边定义它是一个int类型,但事实上它执行的过程呢,是相当于把这个sum。整个这个函数是在它使用的过程当中才去做一个执行啊,当然了就是这里边这个sum,有同学可能会想到,那假如说我后边再来一个some就在这里啊,我们再来一个字。带来这样的一个result的一个输出,那这里边这个四难道中间还会再去调一次这个3SUM调用的这个过程吗?诶,不会啊,这点上跟我们之前讲到的传名参数是不同的,因为前面传名参数它是代码块嘛,完整的放在这儿的话,那每一次相当于这个sum要重新调用一下,而现在不是,现在它相当于还是一个值,还是要把这个值直接传递给后面的这个result,但是呢啊,就是第一次计算这个result值的时候,执行这个sum方法的时候,是要到后边第一次出现result应用的时候,我们想要用它的时候才去做这个调用,所以这就是懒加载的一个。
05:34
底层的原理,大家可以认为它有点像是一个,呃,它比较像传名参数,但是呢,跟传名参数又不一样,它本身使用的时候还是一个值只计算一次,对吧?啊,就是这里边some只是调用一次,这个大家要区分开,所以我们就理解了,为什么这里输出的是132,然后四呢。那就是首先这里边是lazy出现sum的时候不会直接调用,不会得到result值,而是等到用的时候才计算,所以我们先输出的是一函数调用,然后接下来呢,二这里遇到了result,所以接下来要先去计算一下result的值,调用sum函数输出的就是3SOME调用。
06:17
得到了它的值,那当然接下来就是2RESULT等于60,那后面再调用的话,那result值已经算出来了,那不需要再算了,所以就是4RESULT等于60,这就是懒加载啊,惰性求值的过程。
我来说两句