00:00
我们已经了解了skyla里边的空类型,比较特殊的这几种数据类型啊,那大家可能会发现啊,关于这个空引用和nothing啊,他们的这个看到我们具体看到的对象的这个值还是比较好理解的,那的话,这很明显这是这里的一个关键字啊,如果要直接打印输出显示的也就是nul,那那这个nothing呢,如果要是想直接看到它的值,你看不到对吧?因为这里面如果要是本身返回nothing的时候,其实就已经抛异常了,根本就获取不到它的值,这个我们都好理解,但是前边的这个空值unit类型,为什么我们看到它的值打印的时候它是一个空括号呢?啊,这可能是大家会想到的一个比较特殊的问题啊,所以接下来我们再给大家做一个扩展,深入到源码里边讲解一下为什么这里输出的是一个空惑号啊,那自然我们就要点开大家看啊,CTRL,然后点击前的unit,我们深入到scla底层源码里边看一看unit这个类型到底是什么。
01:04
首先我们看到它继承了any value啊,那首先它这是一个值类型啊,跟我们前面讲到的scla的类型系统这是完全一致的,然后呢,它本身是一个final abstract class,它是一个抽象类,哎,所以大家会想到,那它具体应该呃怎么样去实现它呢?所以这里边大家看到我们要找其他的代码啊,本身它是抽象类,那我们看看它具体的实现又应该是什么样子,我们自然看到了下边在同一个文件里边,跟它同样名称的还有一个object。所以这当然就是它的当前这个类的伴生对象了,当前这个伴生对象unit下边有一个box方法在这个方法比较特殊,它在这里边呢,就相当于要传入一个unit的对象,Unit类型的对象,然后最后要返回一个什么呢?这里是它是这个方法的返回,返回类型嘛,那返回的是一个box unit。
02:05
我们知道box本身有盒子,有包装这样一个意思,所以这里的box方法其实就是一个包装方法,是要把当前我们输入的这个unit类型啊,这里是抽象类吗?我们当前要把它包装成一个具体可用的包装类型,而具体我们返回的又应该是什么呢?具体返回的是在这个包装类型里边定义的这个属性,Unit这样一个属性,那接下来我们看一看这个unit属性又到底是什么东西,具体点进来我们就看到了啊,这个run类unit啊,它是一个final class,当然这是一个Java类了啊,Public final class,然后我们看到它里边是构造方法私有化box unit,然后怎么样呢?是全局是不是定义了一个static的一个对象啊,静态的对象,那么这个对象就叫做unit unit呢,本身就是new了,一个box unit就当前类的一个对象。
03:08
嗯,自然我们看到了,这不就是单例设计模式吗?这不就是全局只有一份这样的一个静态对象unit吗?而且它的它是谁的对象呢?就是当前包装类box unit的对象。这下我们就知道了啊,最终我们使用这个unit类型的时候,其实我们获取到的这个对象,它的那个唯,我们所说的那个唯一的对象实例到底是谁呢?其实就是这里它对应的包装类型box unit里边的这个静态对象。所以我们用的就是它啊,那大家看到下面还专门定义了一下它的type,它type是什么呢?啊,其实就是Java烂VO的这个type对吧?哎,所以就是这个大写的void跟这个Java里边定义的空void是可以认为是等价的,然后另外大家会想到,那为什么你既然这里边我们获取到的应该就是这个boss unit的一个实例嘛,这个unit嘛,那为什么打印的时候我们看到的是一个空括号呢?
04:10
这个原因也在这里,下边有一个to string方法,To string方法returned就是一个空括号,所以大家就想到了,如果这个时候我们想要获取到一个unit类型的对象,然后想把它做一个打印输出的时候,那在这个printline里边,这里其实要调它的to string方法的,那to string方法把它转换成了唯一的这个对象实例啊,Box unit转换成了一个啊。空括号打印输出,所以我们就看到的是一个空括号啊,这里结合底层的源码给大家做一个具体的讲解啊,这一部分作为一个扩展啊,大家可以感兴趣的同学可以深入到源码里边去看一看它的底层原理。
我来说两句