00:00
我们已经了解了scla当中函数的基本语法,知道了怎么样去定义一个函数,而且也了解了函数参数的一些特殊用法,那接下来呢,就是一个重点内容了,所谓的函数质简原则,那这个原则其实非常的简单,就是要尽量的让函数简化,如果用四个字概括的话,其实就是能省则省,也就是说这个原则可以让我们使用scla这门语言的时候,编写代码的过程当中可以尽量的偷懒,诶,能省掉的东西我们全部省掉,然后只要保留我们最关心的那些东西。简洁明了的把它留下来就可以了啊,那具体来说的话,里边其实有很多的细节,那我们可以在代码里边一一的来做一个测试说明,第一,首先我们还是在空前第五章的下边盯建一个scla的object,然后接下来是TEST04,我们要做的是函数的简化,所以是simpl法,没方法写出来,我们要做的测试是函数试点原则。
01:13
那首先我们把这个所有的。要测试的点先放在这里,既然我们是要做函数的简化,那首先我们应该先去正常的去声明定义一个函数啊啊,那为了后面做简化方便,我们就把这个参数和返回值都要都要定义出来啊,要不然之前我们讲到有一些函数是可以没有参数没有返回值的啊,那这个我们是先把它完整的都写出来,先我们定义一个,这个叫F0吧,后面每一个原则我们就新定义一个函数,就叫F1F2,依次去这样的一个证明,所以比方说我们定义一个参数,就叫内一个string类型,然后最后呢,返回一个string类型,后边是函数执行的函数体啊,那比方说这里我们可以。
02:04
这就不用print line了,因为我们最终是要返回一个string,那干脆我就直接把这个name做一个返回好了,Return内,这当然是没有问题的,传入一个name,然后直接返回一个name,好,那那接下来我们可以先看一下正常执行的过程到底是一个什么样子啊,比如说比如说我们直接打印当前的复零,要做一个调用输入艾特硅谷。那这个自然我们能够想到啊,输入艾特硅谷,那这里边返回的就是艾特硅谷打印直接输出的当然也是艾特硅谷了啊,这是最常见的直接声明函数,然后进行调用的过程,然后接下来我们看怎么样去做简化呢。第一条,首先就是return可以省略,哎,什么意思呢?就是这里边其实大家看到idea里边自动已经给我们有提示了,这里的return其实是没有必要的啊,这里这个关键字return关键字它是冗余的啊,多余出来的,所以我们在skyla的代码里边,大家会发现你不需要专门去指定瑞特,为什么呢?因为一个代码块,我们自然就会以它的最后一行代码作为当前代码块这个表达式的返回值。
03:20
大家如果回忆一下的话,应该还记得之前我们讲过if else,代码块的返回值其实就是用当前代码块里边最后一行表达式的值作为返回值的啊,所以当前其实函数里边也是一样啊,这函数体不就是一个代码块吗?哎,所以其实并不需要单独去定义return,直接用最后一行作为返回值就可以了啊,那所以按照这个规则的话,非常的简单,我们再定义一个F1。那接下来把name string参数作为参数传入,然后返回的时候呢,直接写一个name就完事了啊,所以这个其实整体来讲跟前面这个还是完全一样的啊啊,那我们还是要测试的时候,上边来一个。
04:08
分割线。那接下来在调用的时候呢。可以直接调F1把艾特硅谷传入啊,那这个如果运行一下的话,当然跟上面就是完全一样,没有任何的问题,都输出的都是艾特硅谷,接下来我们再看第二条,第二条说的是如果函数题里边只有一行代码的话,可以省略花括号,哎,这又是什么意思呢?呃,这个其实之前在二里边也有这样的用法,比方说我们定一个呃,If else啊这样的一个条件判断,或者是定义一个一个for循环啊,那其实一个代码块里边如果只有一行代码的话,那其实这个画括号就没有必要了,对吧,直接跟在后面就行了。而且大家看到skyla的这个语法里边呢,还非常的有特色,就是它定义函数的时候有一个等号,所以这个如果要是省略花括号,其实就变成了这个样子。
05:05
上直接可以把name跟在后边了,所以当前我们这个换一个名称啊F2,然后name是参数,然后返回值是string类型,直接等于内,这就是它当前的返回值,因为我们知道最后一行表达式的值就是返回值嘛,所以就直接等于内,后面我们调用的时候,当然也是这样一个调用方法啊,直接运行还是相同的效果,当然了最后还有一条,我们看到如果返回值的类型能够直接由编译器推断出来的话,我们说这个返回值的类型也是可以省略的,当然省略的时候就连这个冒号一起省略掉了,所以如果再做一层省略的话。F3E的时候。大家想到这里面既然返回的是name name,这里边参数我们已经声明它是string了,那当然编译器能够自己推断出来我们要的这个返回值类型就是string啊,所以干脆这里我就直接把它删掉了。下面我们调用的时候,F3。
06:11
直接做这样的一个打印输出,显然还是S硅谷可以直接正常输出啊,所以大家看一层一层的简化,简化到最后。这不就只剩下了一个函数的名称,然后一个参数后边直接给一个它的这个表达式,当前这个函数到底怎么做计算,我们看到它不就相当于是助学上的函数。FX等于X吗?啊,这里边只不过我们这里的F这个函数名称是F3嘛,我们把它叫做F3,然后传入一个参数,当前的自变量是X,那么返回的值因变量又是什么呢?因变量就是自己,就是X,所以大家看到这不就是F3内,内就是X吗?F3内等于内,这就是一个标准的函数的生命。
07:05
跟数学上的函数表达就完全一致了,所以大家看这个在scla的函数质检原则里边,能省则省,它主要是想让我们怎么样呢?其实就是尽可能的把不必要的或者是编译器自动能够推断出来的东西全部省略掉,最后写出来的表达式非常的符合大家在数学上函数的直接使用的这种习惯,哎,这就是我们的目的,函数式编程就体现在了这里,它关注的就是我们数据的映射关系,XY这样的一个映射关系。就是基本的一些考量,然后另外呢,还有其他的一些对应的规定,比方说第四条,我们看到如果。如果我们在这个函数定义的过程当中,函数题里边有了的话,哎,那大家注意啊,如果里边我们用了return去做了一个返回。
08:01
前面我们说可以省略,但如果你没有省略的话,那这里我们的。返回值类型就不能省略,必须完整的写出来了啊,那这这个其实直接直接举一个例子,大家就会看得非常明显啊,我们直接把上边的F0。复制在下边可以定义成F4,如果说我们下边这里定义了return的话,其实大家会看到啊。我们会想到,那这里能不能直接把它这个删掉呢?哎,这是不能的,大家看,如果要是直接删掉的话,我们这就直接报错了,说这个return是有问题的啊,它这里边自动推断认为是nothing,这当然就不对了,对,所以大家看到就是如果我们要省这个返回值类型的话,那一定要把函数题里边的return要省略掉,如果你不省的话,那就必须全部都把它列出来,这是关于这样一个原则啊。啊,当然这个如果要直接运行的话,跟前面结果肯定还是完全一样,如果要是把这个string去掉的话,那这个运行就会直接报错了。
09:10
大家看到这里边就是。必须需要有一个返返回值的type,一个类型。好,我们直接把这个注掉。接下来我们看一下第五个原则,那是函数如果声明它的返回值类型是unit,也就是空返回值的话,那么即使函数题里边使用了return,那也不起作用,哎,这又是什么意思呢?因为我们看到了F4里边啊,这里边如果指定它的类型,如果我们用了return的话,前面说了啊,必须返回值,这里边必须得定义它的返回值类型,那假如说我们现在。这个F5里边确实用了return,是呢,大家看到return的是name name是一个string类型吧,所以正常来讲,我们这肯定要指定一个string,那我能不能指定别的呢?这里有一种特殊情况是可以的,可以指定unit。
10:09
如果要指定unit的话,那就相当于什么呢?相当于这个return没有作用啊,这个大家也可以联想之前我们在呃,If else里边给大家讲解的那个过程啊,就是如果说。我们直接把这个if else赋值给一个unit类型的变量的话,其实也是可以的,这个时候if else每一个代码块里边的最后一行表达式的值,不管它是什么类型都没用了,都不会作为返回值返回,我们最后返回的就是一个空,所以这里边定义函数的返回值的时候呢,也是一样,那就这里边你可以直接把它定义成空,那这里边你到底是return什么,或者说你没有return省略掉,里边直接给一个这个最后一行的一个表达式放在这里啊,那最后都一样,最后相当于都是一个空,如果我们调用的话,你会看到F5直接输出的是一个空括号。
11:09
啊,这就是关于这个返回值啊,函数返回值是可以做这样的一个对应的定义的,然后后边还有第六条,第六条是说如果加拉加LA里边我们期望是一个无返回值的类型的话,这个时候呢,可以直接省略等号,这又是什么意思呢?我们再定义一个F6之前,我们这里是直接return了一个内,那大家可能会想到这种情况下我可以直接省略等号吗?又不能因为我们这里边有return对吧?啊,那或者如果把这个return删掉之后,那这里边自动推断它其实就是一个string了啊,这个肯定是没有问题的,那大家会想到,如果说我这里边本身就是一个。Print line里边要去打印当前的这个name,这样的话,哎,我这里边需要就是直接把这个unit要补出来吗?诶,这当然就不需要了,因为本身print line这里本来就没有返回值嘛,默认情况下就不需要有这样的一个unit的返回类型,而我们这里边,当然你一方面是可以直接让编辑器去做自动推断,而我们这里呢,是可以直接把这个类型省略掉,甚至连等号都可以省略掉,就直接写成这样了。
12:27
啊,这个大家其实这种写法也不陌生,其他语言里边,你像Java里边,我们定义函数的时候,就是后面直接有这个画括号嘛,直接写画括号对吧?啊,所以这个就相当于跟其他语言做了一个兼容,在这种场景下,我们有时候把这种形式叫做过程啊,就是所谓的这个process,因为大家知道这里边相当于我只是这就相当于不是数学上的那个映射关系了,因为没有返回值啊,哎,那这个时候其实我就是定义了一个计算机要执行的一个子过程,一行一行执行里边的代码就完事了,所以有时候把这个叫做过程,那后面我们这里的执行呢?
13:06
当然就是printline的时候,先要打印一个艾特硅谷出来,然后再打印它的返回值,它返回值就是空,是一个空括号,这是这样的一个结果。然后接下来呢,我们再看第七条,第七条说的是如果函数没有参数,是声明了参数列表,这个时候调用的时候小括号是可加可不加,哎,这又是什么意思呢?我们重新看一下F7前我们定义的是有参数的。假如说要是没参数呢。哎,当然这里没参数,后面我们就不能有name了啊,比方说我们在这儿直接还是print line。直接print line一个at硅谷啊,当然如果这样做的话,我们这里的返回值就应该是一个unit类型啊,这样的话就没有问题,那接下来我们要调用这个F7的时候,其实可以怎么样呢?正常的调用方式当然就是F7,然后括号,括号里边因为没有参数,所以我们是空的,这是一个正常的调用方式。那另外还有一种方式就是直接写F7,也是一种用的过程。
14:20
啊,后面这个就不用再呃再打印它了,如果打印它的值肯定是空嘛,空括号我们就看一下这两行,这不是都能起到调用一次F7的作用,运行一下。大家看到艾特硅谷输出了两次,就是前面F7这个是正常调用,后边呢,不加小括号也是一个正常的调用,注意前提是必须它这里边是一个空参数,没有参数,而且我们这里边是把它声明出来的啊,声明了这里是空参数,那接下来调用的时候可以省略掉啊,那既然我这里强调了,就是我们前面定义的时候是把这个括号声明出来的,那当然啊,这里面就有另外一种场景。
15:06
函数在声明的时候是可以是如果没有参数的话,是直接连这个小括号都可以省略掉的,那如果是这种情况的话,调用的时候那就不能加上小括号了啊,这又是什么意思呢?再给大家把这个例子完整的写出来,现在是F8,那既然它是空参数。调用的时候可以省,那其实大家就想到了,其实声明的时候,我这儿也可以直接把它省,接下来调用的时候呢。那就要注意了,声名的时候如果根本就没有括号,那要用的时候也就不能加括号啊,大家就就会看到,尽管是我们知道它肯定是空参数,但是你加上括号就不对,只能是。直接用这个函数名去做一个调用啊,这就是这样的一个规则啊,现在这个F8还是可以正常输出,艾好最后一条,最后一条说的是,如果我们甚至都不关心当前函数的名称的话,只关心它的处理逻辑的话,那么连函数名和前面的这个DEF都可以直接省略掉。
16:20
这又是什么意思呢?哎,那那比如说我们这里还是定义一个。我们定义一个就是呃,带参数的吧,这个带参数的看起来会更加的清晰一点啊,比方说我们这里边给一个name string。后面返回一个unit里边,我们就直接把这个name做一个打印,接下来是一个F9啊,那正常情况下我们声明的时候啊,本来应该是这样的一种情形,那我们现在可以把它声明成什么呢?哎,直接就是把前面这些都去掉了,哎,那大家想去掉之后是不是接下来就只剩下一个参数了呀,哎,所以接下来是这样的。
17:03
哟,竟然只有这个参数名称和它的类型,大家想你这个只有参数名称和类型,我怎么知道它是用来作为一个函数的参数呢?哎,那接下来后边大家看这个啊,不是用号了,而是要给一个引号加大于号。有点像一个朝右的箭头。啊,那后边再跟上当前的。函数体的这个表达式啊,那所以接下来我们其实就是把这个写到了这儿,大家看这样写写法,这也是一个函数的声明,只不过当前的函数就已经没有了名称,只一剩下的只有参数和它的实现的函数体。啊,所以我们如果只是关心这样一个函数它的处理逻辑的话,那其实可以直接把它声明成这样。这样的一个声明方式,这就是我们所说的匿名函数。
18:04
或者我们把它叫做拉姆达表达式,就是传说中的拉姆达表达式啊,那当然了,这个拉姆达表达式是盖拉里边的比较啊,有有特色的一个函数式编程的一个要素啊,那么在Java1.8里边也是反过来借鉴了盖拉里边的这种用法,也引入了拉姆达表达式,当然在Java里边的拉姆达表达式跟这里边我们用的符号不太一样,我们这里是等号加一个大于号啊,那Java里边是一个连字符横线加一个大于号,但是它的本质其实都是直接定义了一个没有名字的函数,这就叫做匿名函数。啊,这一部分我们关于函数质检原则就先给大家讲到这里。
我来说两句