00:00
练习一主要考察的是我们对于匿名函数的一个实现,以及把函数作为值进行传递的这样一个过程,那接下来我们再来看一下练习二,练习二呢,相对来讲就会复杂一点,我们看它的描述啊,是要实现一个函数放啊,现在不是匿名函数了,就是直接定义这样一个函数,它呢接收一个int类型的参数,也就是它的参数只有一个,是一个int类型,然后返回值。还是一个函数,所以我们知道了练习二主要考察的是。把函数作为返回值返回的这种情景啊,那这里边我们要返回的这个函数如果记作F1的话,它又长成什么样呢?诶,这里边麻烦的就是它又是一个返回一个函数的函数,它的参数是一个string类型的,那么当前它返回的函数呢?又记作F2,那么F2又是什么呢?F2简单一点了,它是接收一个差类型的参数,返回一个补类型的值。
01:01
所以大家可以看到啊,当前我们定义的这个函数fun其实是一个函数套函数的一个形式,而一层一层它的这个参数呢,跟前面有点类似,也是三个分别都是int string差类型,所以我们调用的时候应该怎么调呢?大家看到是这样的一种形式,我们先放。它只有一个参数,所以我们传一个int类型的值进来,得到的是什么呢?得到是一个函数,是F1,所以如果说我们想要继续得到值的话,那F1还要再做调用,F在调,F1在调用的时候呢,传的是一个string,所以这样调用下面再加一个括号啊,两个括号之后得到的是F1的返回值,同样又是一个函数。这是F2,然后F2再做一重,调用三个括号之后,再传一个差类型的值进来之后,得到的就是一个布尔类型的返回值了。啊,那我们的要求呢,跟上面一样,同样还是如果传入零空字符串和零字符的时候,得到的是false,其他的情况返回处,接下来我们在代码里边做一个实现,那上面我们这里是做一个界限,把它分割开,然后接下来上面是练习一,我们接下来就是练习二。
02:23
我们要定义的是一个放函数,那参数非常简单,不是一个int类型,那这里边的返回值就稍微有点麻烦了,因为它是一个函数啊,那首先我们知道这个函数的写法肯定是这样啊,呃,是到底是参数是什么,返回值是什么,这个现在我们好像一下不太好想先把它空在这儿,稍后我们再来解决这个问题。后面应该有一个等号啊呃,目前我们这里边要留下的是它的这个函数的回类型啊,是一个函数,那接下来我们再看里边,里边我们要返回的是一个F1,当然了,这个F1我们先把它放在这儿,前面要有这个F1的定义的,定完了之后最后要返回的时候是不是直接放在代码块的最后一行就可以了啊,所以这个是完全没有问题的啊。那F1的参数又是什么呢?我们说了它只有一个参数是string,同样它后边的这个类型也不太好想,我们先把它空在这,但我们知道里边F1要返回的呢,是一个F2,所以接下来里边同样是定义这样一个F2 f2就比较简单了,它的参数是一个差回值是一个玻璃,那么它的具体实现。
03:46
那具体实践其实非常简单,那就是现在不是is sc参数都有了吗?都有了的话,那我不就是直接判断如果I等于零,并且S等于空字符串,并且C等于零字符的时候返回false,否则的话返回处这个逻辑是不是跟之前一样啊?哎,所以我直接把这个copy过来就完事了。
04:08
好的话,我们就做了这样一个实现,但上面我们的类型还没写完,现在写写到这一步之后,接下来我们就可以逆推回去了,首先F2这个其实已经完成了,那接下来我们看F1的类型到底是什么,F1的类型返回值类型其实就是就是F2的类型吧,那F2的这个函数它到底是个什么样的函数呢?哎,我们就看到了F2的输入是R类型不出啊,返回值是零类型。我们当成一个函数的话,就是输入差输出玻璃这样的一个映射关系嘛,啊,所以这是F2的类型,也就是这里F1的返回值类型,那再上一层funk的。返回值类型又是什么呢?那就是F1吗?F1的输入参数是string类型,那输出是什么呢?输出不就是F2吗?已经写好了函数类型,所以当前的funk的返回值类型是这样的一个函数,这个函数呢,String作为输入,它的返回值又是一个函数,哎,这样的话就完整的把它写好了,那接下来我们可以做一个测试。
05:20
我们也看到了,做测试的时候要用funk,它是需要先传一个int类型零,那得到的是F1,然后呢,再传一个string类型,到的是F2,再做一重调用,传一个零字符,一个差类型,才能得到最后的for false的一个布尔类型的值返回值啊,那大家知道我们测试的时候这个应该返回false啊,所以这就相当于是把我们练习一里边的三个参数。相当于并行的三个参数分成了三个步骤,一层一层分成三层,逐逐步传进去,一次一次调用,把它传进去变成了这样一个过程啊,那接下来我们还可以测试一下它的一些场景,这边我们把这个。
06:14
二变成一个一把这个数值变成23,这里边我们可以给一个哈,那如果正常的话,运行结果应该跟之前是一样的,都是第一个是false,后边都是处啊,大家看到这个是完全没有问题的,这就是我们使用。函数作为函数的返回值,实现了这样的一个功能啊,那大家可能会发现啊,这样一种定义的话,实实现起来好像有点太绕了,特别是这个类型啊,别的还都好说,这里边的这个类型好像真是有点太麻烦了啊,那这里边,而且这个层层嵌套啊,这个代码看起来也不舒服,我们直接这个可读性其实是大大降低了的,这跟skyla本身的设计初衷是不符的,那能不能做一些简化呢?
07:02
哎,当然是可以的,我们看到这里边我们定义的时候还是完整的把这个函数定义出来了,那能不能直接定义成匿名函数呢?因为大家想到这里边我定义了一个F1,然后最后把这个F1整体返回,其实它叫什么名根本没关系对不对?那我这里根本不关心它叫什么,所以直接定一个匿名函数直接返回不就可以了吗?哎,所以接下来我们可以把它做一个匿名函数的简写,匿名函数填写,首先我们把这一个的类型先译好,这个外层的这个fun,它的类型肯定是不变的啊,所以直接把它抄过来,然后里边怎么样去写呢?哎,那里边我们还是先把这个都copy过来。我们想的是首先这个F1,我们把这个fun叫做一啊,或者叫方二都可以,首先我们这个F1名字不重要了,可以直接把它删掉,改成一个匿名函数,那最后那就不需要再返回F1了,知道匿名函数本身就是一个表达式吗?那么大表达式,所以当前这个函数题里边只有这么一句代码的话,一个表达式的话,那当然它的值就是我们的返回值啊,所以只要把这个匿名函数完整的写出来就可以了,那既然把把它改成匿名函数,大家知道匿名函数有一个特点啊,就是不需要写函数的返回值。
08:32
然后接下来呢,我们需要把后边的这个等号改成头,哎,那就把它完整的写出来了,那这样一改就不报错了,完全正确。同样里边的F2本身我们也不关心它的函数名称,也可以把它改成匿名函数。最后不需要返回F2,把匿名函数实现,哎,下来就直接返回就可以了,同样这里不需要有它的返回值,然后把这一个等号改成等号,这样就实现了这样一个功能啊,那当然了,还可以进一步简写。
09:07
我们知道在外层如果把这一个返回值类型都已经定义好的话,那我们接下来在里边声明的这一个匿名函数,它的这个参数类型一定是确定的,因为你看里边的我们这个函数啊,这个匿名函数它的参数肯定是string嘛,然后返回值的类型呢,肯定是这样一个函数嘛,所以那一层是不是也必须是差到booing啊,所以你这个这里的S和C它的类型不用写,我们也已经知道了。所以我干脆把它都省略掉。把这个都省略掉之后,但括号也可以省略掉啊,只有一个参数,另外呢,会会发现这里边不都只有一行代码吗?所以连花括号可以省略掉,再进行省略的话,就可以把它写到一行里了,再看最后相当于就是这样一个过程,就是我们定义了一个FUN1,它有一个参数I,然后里边呢,因为它要返回一个,返回一个函数嘛,所以里边呢。
10:14
里边还可以再定义进一步定义别的参数,再定义一个S,再定义一个C啊,然后接下来呢,我们的标准就是这样的一个判断if的一个逻辑,这样的话就看的会更加的明显一点了啊,当然调用的过程当中肯定还是这样一个调用啊。得到结果肯定还是一样的。我们可以做一个测试。这个一把这个都改过来。运行一下,我们看一下是不是第一个是false,后边都是处,大家看完全没有问题啊,这就是关于呃,前面我们讲到以函数作为返回值,然后改写成匿名函数的这种形式啊,可以大大的做一个简化,呃,那这一部分呢,其实大家看到了啊,我们的这种定义在内,相当于是一个函数的嵌套啊,外层函数里边还有函数,那么内层函数里边的这种情况,其实是可以直接使用外层函数传递进来的参数的,哎,所以这种方式啊,我们相当于。
11:24
是把这一个外层的参数,或者说外外层函数定义好的变量都可以传递到内层函数里边去做处理啊,那么如果底层有相关的这种处理和优化的话,可以把它直接打包在一起,这就是我们传说中的壁包啊,那关于这个币包呢,我们后面会给大家做详细的讲解,这里可以先提一句,就是针对币包,我们还有另外的一种写法,是传说中的科理化,科理化是什么意思呢?就是针对当前的这个例子啊。我们定义的时候可能会发现直接这么定义的话还是有点麻烦,最麻烦的点就在于这里边我要写这个返回值类型,那这个类型啊,太绕了啊,一开始可能很容易就写错,那怎么样能够更简单的定义呢?我直接可以把它写成范func啊FUN2,首先它的类型是参数是一个I,类型是,然后后边不是它还可以定义S和C吗?
12:32
然后这两个类型我们是通过之前我们写的时候是通过它的返回值类型来表示出来的,那现在我可以怎么写呢?不用那么写了,直接在后面第二层的参数是SG,第三层的参数是C差。然后。最后返回的值的类型是一个布里里边的具体实现,这个代码的具体实现那就是。If a等于零,S等于空字符串A等于零字符的时候,返回false else处,大家看直接这么做也是可以的,这种表达形式叫做函数的颗理化,然后我们调用的时候呢,哎,大家看这个调用的形式就跟我们这里面定义的形式完全一样,对吧?所以里边也是非常理解啊,而且非常直观的就可以看到定义,免了我们复杂的那些函数类型的判断,所以一般要推荐大家在scla里面使用的这个定义方式,就是这样的一种定义方式,我们做测试的话,会发现它得到的结果也是完全一样的啊,那关于函数的。
13:43
颗粒化和必包这部分的知识我们会放在后边再专门给大家做一个讲解。
我来说两句