00:00
接下来我们再来介绍一下scla当中比较有特色的一个概念,那就是元组,那元组的字面含义就是元素的组合,它其实并不是一种集合类型,但是呢,在skyla的底层语法里边,它是非常重要的一种数据类型,所以我们专门给大家做一个介绍。所谓的元组,说简单点,其实就是把多个无关的数据直接封装在一起,变成一个元素的组合,哎,那这种东西我们就叫做元组,所以它可以理解成是一个容器,里边呢,可以存放着相同或者不同的类型的数据。简单来看,它其实跟前面我们讲到的列表list有点像,那list呢,里边存放的数据类型应该是完全相同的,而元组呢,那就是放进来之后,首先它不可变,有点像不可变列表,其次呢,它就相当于是一个any类型的列表。
01:01
啊,那这里大家需要注意的是,在盖拉的定义当中,元组的类型最大只能有22个元素。这是由skyla源码底层给我们实现的那些具体的类型决定的。那另外声明元祖的方式。非常的简单,直接用小括号括在。一起所有的元素呢,用逗号分隔开,可以是相同的数据类型,也可以是不同的数据类型。其实这一部分在前面我们讲啊。Map的时候已经涉及到了,大家会看到,呃,我们前面不是可以在里边直接去添加元素吗?添加KL对吗?这里边我们用到了一个小括号,括起来一个K,一个Y6逗号分割,那它其实表示的含义是什么呢?这就表示的是一个string类型的数据和一个int类型的数据打包放在一起,变成一个组合,然后作为一个参数传入。
02:03
那所以这里边的这个组合,这就是一个二元组。那接下来我们在代码里边做一个具体的测试,看一看元组到底应该怎么用,现在是特S的值,我们要测的是元组,英为名字叫做double内,那接下来首先我们就是创建元组,共建元组的方法非常的简单,直接小括号括起来,然后里边可以随便给一些内容,比方说我们给一个字符串,另外给一个整数还可以啊,随便给啊,给一个当前一个符,给一个布尔类型的值,这些都是可以的。同类型都可以放在一起,那当前的这个temple的类型到底是什么呢?呃,难道真的是我们前面说的是一个any类型的list吗?哎,当然不是这样的啊,因为list本身我们知道它能够实现的对应的那些子类啊,都已经在那个文件里边给我们定义出来了,没有这样的定义list子的方式,当前这个元组的类型,如果写数据类型的话,就是表括号括在里边的应的每一个数据的类型,注意定啊二。
03:28
还有物理,这就是我们当前定义元素的过程啊,那有时候呢,会把这个就是比方说里边有四个元素,我们就把它叫做四元组,有三个元素就叫做三元组啊,那对于这个元组类型,也可以直接调用print蜡把它做一个打印,我们看看得到的是什么。大家看到非常简单,输出也就是直接用小括号括在一起,逗号分割,把它们一个一个输出出来啊,就是相当于two three之后输出就可以了。
04:02
创建出来之后,那接下来我们自然考虑的是这东西我们到底怎么用呢?我们自然想到了对于一个一个列表,我们把它看成一个安类型列表的话,列表里边我们至少应该能访问到它的每一个元素嘛,那当前我能够访问到元组当中的数据吗?当然是可以的,接下来我们就是访问数据。访问数元组当中的数据啊,它用的其实就是直接,然后直接点我们看到I in的有属性,如果是一个四元组的话,这跟它的个数有关,如果是四元组的话,它就有这样的四个属性,分别叫下划线一,下划线二_三和下划线四。这里如果我们直接一个下划线一,自然这个得到的就是哈,如果下划线二得到的就是100,不然三就是A的伏二千四是出,我们可以运行一下,看看对应的这个结果啊。
05:06
啊,大家看到这就是把每一个元素列举在这里了,因为我们当前元组的个数一开始声明定义的时候就已经是确定了的,而且类型也都是定死了的,所以这里面呢,我们对应的每一个属性,它的类型和值也是完全定定义好的啊,这就是直接访问数据的一种方法,那当然了,另外如果说有时候我们不想用下划线的这种方式访问的话,在这个元组里边还有另外一个。另外一个方法啊,叫做limit,然后呢,它可以传入一个索引位置,然后直接打印,可以得到对应索引位置上的值。所以大家需要注意这个索引位置呢,我们看到了这是从零开始的,如果是product element1,它其实指的是下划线二啊,所以一般这种方法可能不太好用啊,还是这个下划线会更加的直观一些。
06:06
那这里。如果我们想要去。人力当前的所有的元素,那怎么办呢?哎,其实有同学可能想,那我就直接那个知道它到底是几元组嘛,我这里边就直接这个下划线一下划线二_三这个依次去访问不就完了吗?但这个就太麻烦了,而且前面我们说过,当前skyla里边支持的这个原组数据的个数啊,它是从一到22。最多是有22元素,22个元素,那难道说如果是22元素的话,我们要依次把这22个全这么写出来吗?功能是能实现,但是这个代码量就是我们这行数有点太不简洁了,有没有更快的方式呢?呃,当然是有的,你们看建立元组数据,同样我们可以用一个for循环,那for循环的话或推导式啊然就是要从一个集合类型里边拿到我们对应的东西了,那怎么样能从集合类型里边拿到对应的东西呢?啊,除了前面我们讲的这个6ELEMENT啊,根据索引位置去找东西,那大家想这不就跟数组列表非常类似了吗?所以现在我们同样也可以拿到当前的一个eerator,一个迭代器,那接下来这个迭代器。
07:31
它本身就是一个iterator类型啊,那对应的这个类型当然就可以作为一个集合类型直接去遍历访问了,对应的里边的每一个值拿出来之后,我们都可以做一个element,一个line打印,那就得到了我们想要的结果。啊,那前面我们分割线把它分割开更清楚一点。可以看到这样同样实现了前面我们依次打印下划线一,下划线二_三,下划线四的这样一个效果啊,所以这样的话可能会更加的简洁高效一些。
08:09
除了这些操作之外呢,呃,其实前面我们也看到了当前这个元组类型啊,跟前面我们的这个map类型是有关系的,我们讲到外部类型的时候,定义的时候,其实直接用了这样一个箭头符号,那这个箭头符号它难道是一种语法定义吗?哎,并不是啊,这个元组这确实这种写法,这是语法定义。只要是编译器看到了这样一种写法,它自动就会把它解析成一个一个元组,那元组的底层到底是什么呢?像前面我们这个map里边这种箭头符号的写法又是什么呢?点进去源码看一看,我们会看到这个符号,它底层其实是一个。Temple two就是一个二元组,哎,所以我们说键值对吗?只有两个元素,这不就相当于是一个两个元素的组合嘛,所以它就是一个二元组,有时候把二元组又叫做对偶元组,一个K,一个value啊,这就是一个对偶元组,我们点进去可以看到啊,是一个final case class,它为什么不是我们之前说的集合类型呢?
09:18
因为它这里边继承自PRODUCT2,哎,也就是说有两个元素的这样一个product,而product类型呢,这就结合它本身是一个treat啊,一个特征,它跟集合就没有关系了,大家看这里面本身就是extend any,然后with product。这就是跟我们之前讲到的seek。Set和MAP3大集合类型并不兼容的,呃,就是并不有这个直接从属关系的另外一种独特的数据类型,而它呢,在我们的SKY拉底层应用非常的广泛,比如说map的这个键值,对,就借用了这里。元组的这样一个数据类型的定义,那我们可以看到在这个二元组里边下面有一个to string方法,那所以我们可以直接把它做一个这样的打印输出,这里面并没有用。
10:11
我们看到这里这个打印输出啊,这里边掉的并不是之前我们看到的对于集合类型的那样一个toth string方法,而是这里它自己实现的一个to string用括号括起来,前面并没有那个类型的前缀啊,那里边呢,是把它的两个。两个属性,我们看到这里边它的两个属性是什么呢?一个就是下划线一,一个就是下划线二,把它的两个属性直接做逗号分割,然后打印输出,这就是二元组的一个处理,那与之对应我们可以看一下。在skyla的源码里边还有TEMP1 temp2 ta3 ta4,一直到TEMP22,所以我们说底层支持的元组个数最多是到22啊,那对应里边的实现呢,22里边大大家看到了,有它它的这个泛型啊,有22个,那就是对吧,T1到T22,然后对应的这个下划线,它里边的属性呢,下划线一一直到下划线22啊,就是这样的一个定义,那对应它的这一个图司string方法,当然也是把这些所有都拼在一起了。
11:22
它实现了,实现了这个特征啊,继承的这个扩展的特征就是PRODUCT22。这就是关于。我我们讲到的元组和map的关系,以及它底层的源码里面的一些实现,除了这部分之外呢,我们最后再来说一下元组,还有另外一个比较特殊也是较有趣的用法,那就是它可以做嵌套,什么叫做嵌套元组呢?哎,比方说这里边我们定一个,那multippla就是一个有点像我们多维数组那样一种感觉啊,但这里边并不是简单的一个多维数组,就是首先我们定元组的时候,括号括起来,那这里面我可以随便定义啊,比方说一个整数,一个Co类型的小数啊,然后可以有一个符串楼。
12:21
然后另外呢,我还可以里边再定义一个元素,就是一个元素又是小括号,而且这个是完全没有影响的啊,一个整数,然后我们这里来一个scla,后边还是随便给一些别的数行,那我们访问它里边元素的时候又该怎么访问呢?哎,这里面比方说我想访问这个scla怎么样能访问到别的都简单,这就是它的下划线一,下划线二_三,哎,这里它的下划线四,其实这个类型又是一个二元组,所以我们现在要访问的其实是大化线四当前。出来temp_四的第二个圆,二个属性,也就是划线二连了啊,我们这样一输出的话,就可以看到对应的那个,大家看到输出的就是scla啊,这个在有些场景下使用起来会非常的方便,所以大家需要把元组类型做一个掌握。
我来说两句