00:00
我们了解了什么叫传值参数,那大家发现这不就是我们平常的这种函数,直接给一个值作为参数传进去就完事了吗?为什么还非得给一个这么奇怪的名字呢?啊,这主要就是要跟后面我们讲的传名参数要做一个区分啊,而且大家其实也发现了这样传值这好像控制也没有变得抽象啊,这哪里抽象了呢?一点都不抽象,你这里就直接做一个函数的调用,然后计算出它的结果啊,计算出这个值,然后直接付给A就完了嘛,啊,该怎么用怎么用,哎,所以真正意义上的控制抽象其实是我们要讲的第二部分团名参数。那接下来我们看一看所谓的这个传名参数到底是什么啊,那我们提到了传名参数呢,它其实传的就不再是一个具体的值了。而是要传递的是一块一部分代码,它传的是一个代码块,哎,所以接下来呢,他其实把一部分可执行的代码传给了某个变量,那然后接下来在这个具体使用这个变量的时候,那会出现什么情况呢?那就相当于每出现一个A,比方说这里我们要是传一个代码进来给到A的话,那就是每出现一个A,它就会把对应的那一段代码执行一遍。
01:21
啊,那所以这里面就有一个问题了,对于这样的一个传代码块的参数,它的类型又应该怎么定义呢?比方说这里边我们再定义一个DEF,一个F2,比方说我们就借鉴之前的。F0的这个写法。我们现在是要写一个F2,那现在呢,我们同样还是一个unit的返回,有一个A作为参数啊,在里边我们要print print line,打印两行,两次使用这个A,现在呢,我们想要传一个代码块进来,那这里的语法书写的时候就不再是它的类型,就不能直接是int了。
02:01
而是写成什么呢?大家注意一下啊,这里的类型也成了一个向右的箭头,有点像我们拉姆的表达式里边的那个写法啊,然后后边来一个in,当然如果想看的清楚一点,空格也是可以的啊,或者接我们就连在一起,因为它是完整的一个类型啊,我它表示什么呢?它表示的就是。一段代码块,这个代码块还有要求什么要求呢?就是代码块的返回值。是int,之前我们说过在盖拉里边一个完整的代码块,它是有返回值的,返回值就是最后一行代码的表达式的值,哎,那所以这里边我们对这个代码块还有要求啊,大家看这个有点像我们对于之前那个匿名函数啊,对于函数类型的那个定义,函数类型是怎么定义的呢?之前我们就是比方说当前输入是一个int类型,输出是一个int类型,那当前这个函数的类型那就是int到int对吧?哎,这就是我们说的这个映射关系嘛,输入的int到输出int之间的一个映射关系啊,参数的类型和返回值的类型,现在呢,现在代码块的定义是没有参数练习,因为大家知道板块当然就不像函数那样有输入了啊,它就是可以执行的一部分代码,但是呢,它有返回值,所以这里边后面我们要跟一个练习。
03:22
这表示的是一个代码块对吧,所以大家要注意啊,传递啊,不再指具体啊值,而是。代码块,当然了,最终这个代码块也有返回值对吧?哎,所以这里边其实还是有一个值的概念在里面的啊,那所以大家看到,呃,这样的话,接下来我们这个执行会跟之前有什么样的区别呢?哎,那接下来我们看一下啊呃,前面我们这里边不是还定义了一个F1吗?那同样现在我们就拿F2来调用一下这个F1,而是把这个F1放进来。
04:07
那这里大家要注意啊,呃,我们这里边要的不是一个代码块吗?你这里边直接写F1调用一次,这也叫代码块吗?诶,当然算啊,就甚至你这里直接写一个23,是不是也算一个代码块啊,哎,只不过就是我们一行只有一行代码的话,可以把这个花括号省略掉嘛,所以这里边你直接传一个整数,这也是完全没有问题的,它就是一行代码回值也是23啊。接下来我们还可以把这个F2,就是直接调用F1这个结果也写进来看一看啊,那为了区别,我们在里面还是写另一行分界线。分析一下,看看结果到底长什么样。看到这个结果其实就比较诡异啊,啊,首先这个F223这个大家可能会想到这个比较容易理解,跟之前还是一样的啊,输出两个A23就完事了,这是没有问题的,那后面这个F1调用的时候呢,之前我们看到是它就调用一次,然后把这个F1的值。
05:12
这是我们要调用它得到一个值嘛,它得到的值是12,所以后边我们就输出两次12就完了,现在呢,现在它不是直接这么输出了,它是输出了两次F1调用,所以这里边我们F1调用了两次,怎么会这么奇怪呢?怎么会出现这种情况呢。这就是我们所说的控制抽象,为什么控制抽象了呢?就是F1到底要执行几次,并不是我们这里边只掉了一次,它就只执行一次,它的执行次数由哪里控制呢?诶是由你要传入到F2,是作为这个船名参数,作为一个代码块付给了A,那你要看A到底调用几次,执行几次,F1就会被调用几次。啊,所以大家要注意,就是对于我们之前的这段代码而言啊,F0调用的时候,A里边传进来的这个F1调用的结果,那相当于我们这里的A就全是它的结果,12相当于我们把这个代码里边的A都替换成12就完了,而下边的这种调用传名字参数的这种调用方式呢,是把A全部替换成F1,括号都替换成一个F1的调用这个代码框,对吧?哎,所以大家要注意,这里边我们并不是把它调用的结果传进去,而是把这个代码框完整的传进去了。
06:37
所以这里边你就会发现,只要用到了一次A,这里边就会来一次F1调用A12对吧?呃,那本身的这个F1调用,这是F1括号这个代码块执行的时候输出的,而A12呢,这是我们print line在这里面输入输出的,对吧?因为A这个代码块它的返回值也是12。
07:01
这就是我们关于船名参数的一个,呃,一个具体的讲解啊,大家可以看到什么叫做控制抽象,所以这就相当于是把这个控制当前这个F1调用的这个权限啊,控制权限抽象出来了,抽象成这里的A了。这就是控制抽象的概念啊,那当然了,我们可以进一步去思考,就是必然里边我们可以把这个二十三生成一个代码块传进去,可以把F1的调用作为一个代码块传进去啊,那假如说啊,我这里边。给一个比方说啊,我直接F2调用的时候,在里边直接传一段代码,这个可以吗。哎,这也是可以的,完全没有问题,比方说现在我们直接print line,我们直接说这是一个代码,然后呃,里边后面因为大家看到这里边还报错,因为要传的代码块是不是最后的返回值必须得是一个int类型啊,哎,所以这里边最后一行,比方说我直接给一个29给一个int就没有问题了啊,所以接下来如果我们要是再运行一下的话,你会发现。
08:11
最后一个这个F2调用的时候它会啊,就是把这一段代码直接替换到这里的A来做一个控制抽象对吧?所以就是每一次用到A的时候都有一次printline,这是一个代码块,然后29 29当然没有具体的输出啊,但是会把会作为一个返回值付给A,所以现在我们的调用就变成了这是一个代码块A29,这是一个代码块A29。啊,所以这就是A代表我们这个代码块的一个执行。大家可以把这个传名参数跟我们平常使用的传值参数做一个区分,理解一下控制抽象的概念。
我来说两句