00:00
那接下来我们就来重点介绍一下scla里边的变量,那那么对于这个变量这个概念呢,大家与之对应的自然就联想起了另外一个概念叫做常量啊,其实这两个概念对应来看的话,常量可以看作是一个特殊的变量。啊,什么叫常量呢?其实我们就可以说在程序执行的过程当中,它的值不会改变的变量就叫做常量啊,这样看的话,这个变量的概念其实就是一个更加广义啊,更加宽泛的概念了,它表示我里边只是存放了一个值,至于这个值到底改不改啊,我可以不去关心啊,这样的话我都叫做变量,那常量呢,就是这个值如果不改,我就把它叫做常量。我们可以回顾一下Java里边怎么样去定义变量和常量,这个语法其实非常的简单啊,首先就是给一个变量类型,声明变量类型,然后后边加上变量的名称,然后呢,就是等于号,后边给变量赋一个初值,比如说我们要想定义一个整形的变量A,给它赋一个初值十,那么直接写出来就是int a等于十非常的简单,那如果说我们想要定义一个常量在Java里边呢,那就要。
01:14
我们说它是一个特殊的变量嘛,所以就是在这个变量声明定义的基础上,前面多加一个关键字final啊,Final int b等于20,那么B其实就是一个整形的常量,它的值一直都是20,不会再变化了,这就是Java里面的定义,Scva里边的语法呢,跟Java略有不同,我们会发现skyda当中并没有用final去做这样的声明啊,因为大家看这其实就是一种呃理念的体现了啊,就是Java里边这是非常典型的把常量当成了一种特殊的变量啊,明显就是在变量基础上加了一个修饰嘛,而skyda里面呢,他认为变量跟常量可以是一个平等的关系,平等的地位啊,所以他是分别用了两个不同的修饰符关键字来做了一个声明的,声明变量的时候用的是VAR啊,那其实我们知道VAR就是英文单词里边variable的前三个字母嘛啊。
02:14
Y,所以它其实表示的就是变量,定义的这个是变量,它的值可以更改,而如果要是声明常量呢,那就用va al,这是英文的英文单词value的前三个字母,那大家知道这个value当然其实就是一个常量值嘛,这个值定义了之后就再也不能更改了啊,这就是skyla里边定义声明变量和常量的方式。那后边的这个语法呢,跟Java也略有不同,跟Java刚好相反,Java是先写类型后写名称,SC里边是先写名称后写类型,中间用冒号分割,在后边等于号,后边复出值,这个就都一样了。那有同学可能会发现,这么看的话,SC拉的语法也不简单啊,看起来比Java好像还更繁琐一点。
03:02
啊,但是这个其实大家会发现scla把这个类型专门放到后边,什么意思呢?其实就是表示这个东西并不重要,我们在编程的过程当中,其实程序员关注的是变量的名称,整个业务处理的逻辑,至于说这个类型到底是什么,其实这是计算机底层要考虑的东西啊,跟我们的这个代码逻辑其实没什么关系,哎,所以在SKY的设计里边,它的编译器,Scla的编译器其实是可以对当前的变量类型做自动推断的,只要能够自动推断出来,那么后边大家看这个冒号加上变量类型这一部分。都可以省略,如果这一部分都省略掉的话,那我们就发现了啊,这个skyla代码就会非常的简洁直接,VAR或者va加一个变量名,然后等于一个初始值给定就可以用了,这就看起来有点像像JS那样的弱类型语言里边对于变量的声明和使用了啊,就是我根本不管它的类型是什么,直接给它一个值拿过来用就可以了。
04:10
呃,那这里面大家需要注意的就是对于scale而言,有一个相当于有一个规则,或者说有一个对大家的一个推荐,那就是能使用常量的地方就尽量不要用变量,这是为什么呢?啊,可以多解释一下,就是这是因为scla前面我们讲过,它不仅是一门变面对对象的语言,它还是一种。函数式编程语言,而在真正的函数式编程语言里边,它有一个什么什么样的想法呢?就是他会想我们当前定义这样一个等式,你如果从函数,从数学的角度来看的话,那其实G等于20,这就应该等于20啊,之后它的值就不应该变了呀,哎,所以在真正的函数式编程语言里边,其实是根本没有变量这个概念的,一个值等于什么就是什么,哎,所以。
05:03
常量的这种使用啊,值类型的使用,这是真正符合函数式编程思想的一种用法啊,那么SC里边主要是为了兼容面对对象啊,面兼容抓va的这种用法,所以还要把这个对应的变量这样的使用也要定义出来,但是它真正推荐的还是推荐使用这个函数式编程的这种思路,哎,所以能用常量的地方我们就不要用变量。关于函数编程,我们在后边,呃,后边的章节还会设计给大家具体的展开,这里只是给大家稍微的提一下,那接下来我们就在代码里边给大家做一些简单的测试啊,这里边大家看到有几个要点,我们可以把这几个要点在代码里面做一个实现。那接下来还是在第二章下边我们新建一个scla的object啊,那当前我们主要是测试这个变量和常量啊,如果我们把常量看作特殊的变量的话,那前我们主要就是测试变量了,S02下来测的是variable。
06:10
同样还是把main方法先写出来,呃,那我们先看一下,就是怎么样去做一个简单的声明啊,声明一个变量啊,通用语法,那简单的啊,我说明一个Y1。后边加上它的类型啊,就前面是名称,加上冒号分割之后,后边是类型,然后等号后边给一个初值,哎,这就是最常见的这种声明变量的方式,那接下来有一些要点,我们还要做一个说明,首先呢,我们要说的是声明变量的时候,类型可以省略,那么编译器会自动给我们做对应的推导,是做这个所谓的自动类型推断啊,自动类型推导,所以这个主要说的是什么呢?就是像前面我们这个定义啊,后边的这个int直接可以不要。
07:10
比方说我们再定义一个A1直接等于十,那大家可能会想到,那当前的这个A1本身是什么类型呢?它就是一个int类型,呃,在skyla里边啊,直接给一个整形的数据数值,呃,来了之后,那么它默认的类型其实就是int,所以这个时候其实后边这一部分我们不写,编译器也可以推断出来,所以直接这么这么写就完事了啊。那如果说想要定义一个常量的话,Val,比方说我们来一个B1等于23也是完全可以的,没有问题。然后我们再看第二个特点啊,第二个特点是类型一旦确定之后能修改,主要说的是什么呢?诶之前其实大家。跟大家说过,就是这种写法啊,上面这种省略类型的写法,其实看起来已经跟JS那种弱类型语言的写法非常类似了,大家知道就是这里边,如果我热类型语言里面啊,直接给一个声明一个变量,然后Y啊一个变量,然后拿来给一个值就可以用它了,那后边呢,这个值还可以随便改,对吧?啊,就是我给一个十,后面再给负一个,比方说这个ae等于啊,等于一个字符串啊等于ABC等于哈,这个也是可以的,但是大家注意啊,我们在GALA这个语言语法里边,如果我们定义了一个,定一个A2。
08:36
它等于15,那么它的类型编译器会自动推断出来它是一个int,我们在这里边给它写一下啊,A2类型为应,那么尽管当前AR是一个变量,对吧?呃,VAR声明的嘛,那所以大家会想到我是不是可以随便给他附一个值,比方说给一个string类型的hello呢?大家注意这样是不行的。
09:04
这样的话,相当于你要把一个string类型的值赋给一个int类型的变量,那这样是完全做不到的。说明skyla跟弱类型语言,像GSM那样的语言还是有本质区别的啊,它是强类型,强数据类型的语言好,所以这一点还是有本质的区别,然后接下来我们再看一下第三条,就是变量声明的时候呢,必须要有初始值啊,这个大家也知道,有一些语言里边啊,它的语法是允许我们直接声明变量,但是不给它付出值的,在scla里边不允许这样做。好,那大家会看到,就是比方说这里我直接给一个第三。一个你看放在这儿,如果直接就这么写的话。大家看后面就报错了对吧?啊,就这里边必须要给一个等号,负了初值之后,这才是一个合法的符合盖拉语法的一行表达式,如果直接做一个声明啊,写到这为止的话,那就不对了啊,或者我们不是想到它可以省略这个类型吗?哎,那那直接写A3也是不对。
10:18
这就是我们当前对于变量声明的时候需要注意的一些要点,然后接下来最后还有一个啊,呃,在声明或者定义一个变量的时候,我们可以使用这个va或者value啊VL去做一个修饰啊,那么它俩的区别就在于where修饰的变量它是可以更改这个值的,而如果用value去修饰的变量呢,它其实就是常量,对吧,这个值是不可以去更改的,它就是值嘛。这个区别我们也可以看的非常的明确,那面我们已经定义了一个A1和B1 a1是用Y去修饰的,所以下来如果我给一个A1等于12的话,是没有问题的,这是合法的,但是如果我要定义B1哦,应改等于25的话,就会报错了啊,我们直接写的话,它也会我们我们对于这个value啊,一个常量值做了一个重新分配值的操作,这是不合法的,这是大家需要注意的一些点,关于这个Y和value的区分呢,对于这种简单的一些就类类似,这就是一个值类型啊,对于类型而言,大家比较好理解,那对于引用类型呢,可能就会稍微的比较复杂一点,大家需要注意一下,比方说前面我们不是定义过这个student类吗?嗯,那大家可能会想到,我现在假如去new一个student类。
11:50
20呃,当时我们定义的时候要传入两个参数,一个是当前的name,一个是当前的age,我们把对应的这一个一章里边的student这个类引入,然后接下来创建这样一个student类的对象啊,那么我当然可以啊,直接定义一个VL,定一个value,我把它叫做Alice,然后接下来大家可能就会想到了,那当前这个Alice对应的我可以做一些更改吗?
12:22
我可以让这个ice再去new一个student,比方说我现在啊,大家可能想到我对于当前这个Alice的这个名字可能要改成一个大写的爱丽丝,然后20,我可以直接直接这样去做赋值吗?当然是不行的,因为前面声明的Alice丝是一个V,它是一个value对吧?啊,所以如果说我们前面给一个R,给一个变量的话,前接这么赋值当然就是可以的了啊,甚至如果愿意的话,直接把它赋成nu,直接赋成空也是可以的,对吧?引用类型直接给这个nu是没有问题的,这跟Java里边是一样的,但是大家会想到,那那照这么说的话,是不是如果是value类型的话,你有一个报B出来啊,如果是value类型是不是就代表着接下来我这个Bob里边所有的值怎么去做更改了呢?
13:21
要这样的话,我们后边这个引用类型的使用,这也太太麻烦了,比方说我过了一年之后,Bob这个名字是不变,但是他这个年龄就会增长啊,我想把他的age改成24,那又应该怎么做呢?诶,其实大家会发现啊,当前的Bob本身它是一个引用类型,它指向的对象不能变,但是呢,对象里的属性其实是可以做更改的。哎,那至于这里边的属性到底能不能改,那就得看这个属性又到底是呃,就是到底是这个呃,Value类型还是Y类型了,到底是可变还是不可变了,所以接下来大家可能会看到,诶,那当前的bob.h能不能去做一个更改呢?哎,里边其实我们可以直接报b.H给它做一个赋值就可以了,但这里边有一个前提就是其实看到啊,我们之前的这个student,这里边辅导方法里边其实这样写的,一开始我们最初是name string edge int,直接这么去赋值,这个去赋值的时候,其实这只相当于这是它的构造方法的一个传入了一个参数。
14:29
哎,那当前的这一个类里边有没有这样的属性呢?其实是没有的,那怎么样能让这个类里边还加入了name和age这样的属性呢?那就是在当前这个参数前边加一个va或者VAR啊,那那家看,本来我如果前面没有这个东西的话,这里这个age是访问不到的,没有这个属性,那现在如果我要访问到的话,比方说我可以给一个V。啊,那当然我们就知道了,V的话能访问到,但是呢,它不能更改啊,所以这里边你不能做赋值操作,如果我们这里边改成VAR,接下来这里就可以做这个复制操作了。
15:08
啊,所以我们这里也可以直接套用一下Bob的print info方法打印一下,你看是不是他的年龄变成了24。我们看到现在Bob就是24岁的一个学生在艾特硅谷学习啊,这就是我们当前能够看到的对于这个常量和变量的一些使用啊,如果是引用数据类型的话,那么本身Bob自身目前如果要是想要去等于这样的一个新的student对象的话,显然是不合法的。但是如果说我们直接对它里边是变量的那些属性啊,袜类型的属性去做更改的话,这是合法的,哎,所以这个特点其实非常的重要,在后边我们讲到,特别是讲到一些集合类型的时候啊,呃,比方说我们自己定义一个数组,定义一个列表,那这个时候呢,本身当前这个列表我们直接把它定义成value啊,定义成这个vaal类型,它本身自自身是不可变的,但是呢,它里边的元素其实是可以做更改的,所以有了这样的一个特性,我们就会发现,呃,之前我们说能用常量的地方就不要用Y,不要用变量,对吧?函数式编程里边我们说本来就没有。
16:30
变量这样一个说法,诶那大家可能就想到,那后面我们要更改它的值的时候怎么办呢?诶我们发现了,只要用这种引用数据类型,用集合数据类型,其实就不存在这样一个问题。啊,这是关于常量和变量的这一部分内容。
我来说两句