00:00
接下来我们就来具体介绍一下scla当中的函数声明的基本语法啊,那这个其实大家也已经比较熟悉了啊,它的语法其实就是这张图里边给大家显示出来的。首先我们要用一个关键字来声明函数,那就是DEF,它是def DeFine英文单词的前三个字母就表示我们要定义声明一个函数。然后后边呢,紧跟着的大家注意跟Java不一样,没有类型,直接紧跟着的就是函数名称,这个函数名称当然就是一个标志符了,要符合我们标志符的定义规则。接下来呢,后边是小括号,里边是逗号分割的,可以有多个的参数,那么参数定义的过程当中呢,也是先给名称后给类型,中间用冒号分割开。啊,然后把这个参数都已经定义好了,后边才是函数的返回值,类型中间同样也是用冒号分割的啊,这一点就是跟Java里边最大的不同,Java里边我们声明定义的时候都是先给类型,后边跟着才是名称,而在SKY里边呢,我们认为类型这是计算机底层要去考虑的一件事情,我们函数式编程里边那是最关心的是它的业务逻辑,所以我们只要先把这个名称写出来就可以了,至于类型放在后边,甚至在很多情况下,我们可以让编译器自动给我们去做推断和补全,我们都可以不写啊,这就是scla的一个基本设计的思路。然后后面呢,呃,有了前面所有定义好的东西之后,后面就是等号,然后跟着花括号,里边是函数体的具体实现。
01:39
这就是函数的一个基本声明的规则啊,那整体来讲还是比较简单的,这里大家需要注意一下,就是我们之前在Java里边一般是不提函数这个概念,哎,我们一般都叫的是方法对吧?呃,那为什么Java里边叫方法呢?那是因为Java面对对象我们定义。
02:00
这里看到的这样的一个函数的时候,它必须得是对象的一个能调用的方法,哎,所以接下来我们做处理的时候,就必须是,呃,把它定义成这个对象的方法才能够。处理才能够调用啊,那所以就不涉及到一般化的这个函数的定义了,所有的东西都是方法,这是Java里面的定义的规则,那在SC里边呢?哎,它这里边是又提出了一般化的函数的定义,那跟Java里边的方法又有什么区别呢?这里我们给大家做一个简单的区分,首先我们提出函数的概念,函数的概念是什么呢?这里边我们讲的是为完成某一功能的程序语句的集合就都叫做函数。哎,所以这个定义的话,那就比较宽泛了,就只要是一段代码,我们把它包起来,然后给一个单独的声明,它能完成某一个功能,那整个这段代码我们就叫做一个函数,那这个函数大家要稍微做一个区分,就是跟前面我们提到的函数式编程的函数。
03:07
是两个概念,外面我们提到的函数式编程的这个概念呢,它是基于数学上的函数来做的定义,就是我们所说的自变量、因变量的映射关系,Y等于FX,这是函数式编程真正的思想来源,而我们在这里程序代码里边GALA里边定义的这个函数概念呢,其实就是计算机代码里边的一段子程序嘛,哎,所以它并不是数学意义上的function,而是计算机子程序,就是所谓的sub routine啊,这是这里的这个函数的一个定义啊,我们一般在计算机程序里边所说的函数都是这样子程序的一个概念。那另外什么叫做方法呢?哎,这里专门定义了类里边的函数,称之为方法,哎,什么意思呢?就是直接在类下边定义出来的这些函数。
04:04
那么创建一个类的实例之后,就可以直接去调用,那这些就叫做方法,所以方法的定义跟Java里边其实还是一致的。那这里边的这个更一般化的函数,那跟Java又有什么区别呢?简单来讲就是之前我们在Java里边,大家想,如果我定义的这个方法,呃,在在外边直接定义,这肯定是可以的,就是在这个呃,一个类里边啊定义一个方法,这是没有问题的,那假如说我已经有一个没方法了,我能在main方法里边再定,再单独的把一段代码,把它包装成一个一个方法,可以吗?可以这样这样去定义吗?显然是不能的啊,所以Java里边我们的函数或者说方法是不能随处去定义,随处去声明的,它只能作为对象的方法去调用,去声明。这就是在Java里面是有限制的,而在skyla里边呢,我们说skyla是一个呃,函数式编程语言,对吧?啊,可以说它是面向函数的一门语言,所以函数就是一等公民,它是在任何地方都可以去单独去声明出来的。
05:14
啊,当然这个这里所说的任何地方是是我们在这个代码块里边的任何地方,你不能直接放在这个类或者对象的外边去声明一个函数啊,在里边的话我们是都可以去声明的,只要是一段代码都可以包装起,所以这个我们函数定义的方式就会更加的灵活,使用也更加的灵活,这就是scla里边的一个特点,随处都可以定义函数。好,那接下来我们还是在代码里边做一个具体的测试吧,大家可以看一下到底这个scla里边函数和方法的区别在哪里。那接下来我们是第五章,所以新建一个。CHAPTER05。接下来我们还是直接新建一个GALA的object,那首先是TEST01,我们要测试的是函数和方法,那我们把这个函数还是叫做function啊,尽管跟数学上的FUNCTION1不一样啊,我们还是把它叫做function function method,把我们一般定义叫做method,那方法先写出来,哎,那大家首先看到了,里边的这个may本身就是一个方法。
06:29
当前单立对象里边的一个方法,在外部可以直接调用,可以执行啊,啊,那首先在这个main方法里边呢,我可以直接定义函数,在Java里边是能做的,就是很明显的区别,对吧?啊,比方说这里边我们随便定义一个函数啊呃,比方说我们打招呼吧,叫c hi吧,C hi,还一个比方说是谁打招呼,我们传一个name string类型的name。不要有任何的返回,我们直接就呃,Unit的一个类型,然后直接打印输出一句话打招呼就可以了,这里边直接print line啊嗨,后边直接加上这个name就好了,这是一个最简单的函数定义啊,那接下来定义了这样一个函数之后,那。
07:21
在这个代码里边就可以去调用它,我们可以做一个函数调用,那调用的时候呢,直接用前函数的名称,然后里边函数合法的一个参数,比方说Alice啊,这样的话把它调用出来了,我们可以直接运行,会看到被害执行的过程当中会打印输出一句hi Alice。这是最简单的这种使用。啊,尽管这种使用在Java里边是是不现实的啊,啊在skyla里边这样是合法的,是可以的,那与之对应的,如果说我们把当前的这一个方法定义到了外边可以吗?也是可以的,这个我们如果广义来看的话,定义在外边其实也是一个函数,那为了区别,我们一般就把里边的这个叫做狭义的函数,而把定义在外边的叫做方法了,给我们定义对象的方法,同样我也可以是一个c hi,我可以直接把它copy在这里,大家看立义在外边,立在里边,因为它的作用域不一样,所以相同的方法名称,函数名称,相同的参数,相同的返回值类型,这个都是没有问题的。
08:35
这里不会报错,我们可以同样有这样的一个定义啊,那那接下来大家会想到,呃,我这里边还是稍微做一个区分啊,我们把这个氦变成一个大写的,那在里边我调用这个函数c hi的时候,底是小写的还是大写的呢?到底是调用的上面定义的函数还是外面定义的方法呢?哎,这个其实非常的明显啊,这里调用直接调用的显然就是临镜的这个函数。
09:02
啊,那有同学可能会想到,如果说我这里边没有定义这个函数的话,诶,你看它就会调用大边我们一的这个方法了啊,因为本身在外边定义出来的方法,我们在当前的这个may里边其实也是可见的,也是可以看到的,那这个时候我们直接运行。哎,它这里边输出的就是大写的氦啊,这是这样的一个方式,那当然了,有同学可能想到,那假如说我里边已经定义了一个函数,也叫c hi之后,那接下来我如果想要调用对应的这个对象方法,难道就没有办法调用了吗?因为他们的参数类型都一样,个数也一样,对吧,名称也一样,那那怎么调呢?这也是有招的,可以调用对象方法,哎,那大家想到,既然我都说了要调用对象的方法嘛,那所以你如果要明确的指定,那是不是基于对象去调用就可以了,哎,那什么对象是谁呢?就是当前我们这个TEST01FUNCTION and method吗?接下来大家看有没方法,同样也有一个被害方法啊,里边这里我们可以传一个报。
10:13
接下来我们再运行的话,上面的c hi,这是输出的小写的hi Alice,然后下边这是调用的对象方法,就是大写的hi Bo,哎,这就是关于这个函数和对象方法的调用,呃,那当然了,这里边我们也可以定义其他的一些,呃,对应的其他的一些。有返回值的方法啊,那比方说像这里边我们在呃,如果要是说你的这个参数数不同或者类型不同的话,我们也可以实现这个方法重载对吧?啊,这个是没有问题的啊,那这里边我们可以给一个不同的比方说我们这个叫C。这样的话。参数类型和名名称都还一样,这个就没有问题了啊,不过这里我们可以一个回执类型是string啊,那大家看到这里边的话,你就能直接在这里print line就完事了,必须得有一个返回对吧,所以这里边我们return一个,比方说return目前的这个哈。
11:17
我们把上面这个也改成hello,那接下来如果说要做这个方法的调用之后,还可以到它的一个返回值对吧?呃,获取方法返回值其实跟函数的返回值是一样的啊,也可以把它直接赋给一个付给一个变量啊,那比方说这里边我们直接这个就叫做result吧。Result直接就等于当然了,我们还是基于当前的对象去调用它的方法,A hello,然后这边我们随便给一个比方说是car到这个result,那接下来把这个result做一个打印。
12:04
就会发现前面c hello的时候会输出一句hello carry,那最后呢,还会打印出一个hello,这是result获得的返回值啊,所以整体来看的话,方法和函数在scla里边其实是大家看是差不多的,所以广义上的话,我们有时候都把它们统一叫做函数,因为它就是可以执行的包装好的一段代码吗?能够实现一定功能的一段代码,那所不同的就是我们任意地方都可以定义单独有功能的一段代码,那我们定义出来之后就是一个狭义上的函数,然后定义之后就可以使用,就可以调用,而对于这个方方法呢,它是必须要定义在类或者对象object下边,你不能直接放在这个方法里边去定义,而调用的时候呢?啊,那就需要用对应的对象去做调用了啊,当然前面大家看到,如果要是没有前面定义的这个c hi的话,也可以直接调用下面的c hi,那是因为当前是可见。
13:04
的,如果要在外部程序的话,那就必须要基于对象去做调用。这就是关于函数和方法的区别。
我来说两句