00:00
接下来我们要介绍的这一章呢,是scla当中另外一个非常有特色的内容,那就是影视转换,哎,这个内容可能大家之前在其他的编程语言里边从来没有见过,但是我们之前在学习过程当中,特别是源码的考察当中,已经频繁的见到他,而且看到他怎么用了,到底影视转换是一个什么样的东西呢?这里我们来解释一下影视转换。它发生在。什么时候呢?主要是发生在第一次编译失败的时候,所以这里边大家需要注意,Skyla的编译器啊,要做的事情比Java编译器要多得多,Java编译器我们直接按照语法规则去做,编译失败的话,那直接就退出了。SKY拉呢,编译器第一次失败的时候还不是玩,他还会继续去寻找能让代码编译通过的方法,那这些能让他通过的方法就是所谓的影视转换,将我们当前的数据类型转换之后,就有可能能调一些新的方法,获取新的一些属性,这样就有可能让代码通过编译,所以SC编译器是要进行二次编译的,它是在二次编译的时候要做影视转换。
01:17
那具体来讲,影视转换主要分成了这样的三大类,那一类就是影视函数,还有就是影视参数,另外还有是影视类这样的三大类型,那影视函数呢,我们先简单的说一下,影视函数其实整体来讲,呃,应该说是比较简单的啊,就是说相当于我们是某个类下边的一个方法,这样是比较常见的一种定义,那比方说像之前我们对于这一个int类型要做一个。要调它的一个to方法,生成一个range,大家还记得我们定义这个范围便利的时候啊,For推导式里边,那么int类型本身是没有to方法的,这个兔方法在reach in下边,哎,那当前我们如果想要去调用它的话,应该怎么去调用呢?那就必须要有一个影视的转换方法,哎,那比方说我们可以定义一个这样影视加上implicit关键字定义的。
02:19
函数就叫做影视函数,所以在一个函数前面加上implicit,这个函数叫做convert,这个convert是干什么呢?把一个int类型的参数能够转换成reach int,比方说我自己都可以定义一个叫my reach int,哎,那么假如说我们发现当前的代码编译器发现通不过,诶,没有对应的那个方法,那怎么办呢?他就到处找有没有能让当前的这一个数据类型进行转变的那种方法,诶我们一找,诶这个就能转变,对吧?输入一个int转变成了my int,然后我就看把它转成my int之后,能不能调用对应的方法让它通过编译啊,这样的话就实现了我们很多扩展的功能。之前这个整数reach int里边的to方法得到一个range,就是用到了这样的一个隐式函数的定义。
03:13
这是关于影视函数,那另外呢,还有影视参数,这个我们也不陌生,之前我们讲到集合列表的这个排序的时候啊啊,那saled里边是可以传一个影视参数的,那这个参数的。什么叫影视参数呢?那就是参数前面加了一个implicit关键字,它的特点是说调用这个方法的时候呢,我们可以不传它,也也可以直接显示的把它传进去,传进去的话就以我们传入的参数为主,那如果不传它的话,到哪去找它呢?编译器就会在相应的作用域里边寻找符合条件的影视参数,影视值,那什么叫符合条件的影视值呢?简单来讲就是必须要是implicit声明出来的,关键字声明出来的,而且呢。
04:04
变量的类型必须跟我们这里的影视参数的类型完全一样,这两条必须要满足,注意跟名称没有关系,就叫什么名没关系,只要是有implicit,而且类型一样,这就是符合条件的一个是。而且是在同一个作用域里边,相同类型的影视值只能有一个,哎,所以这个就保证我们找到的一定是唯一的了啊,另外还有一点就是影视参数是优先于默认参数的。最后还有一个是叫做影视类,影视类是SC2.10之后提供的一个新特性,那其实就是直接用implicit关键字声明类了,加在类的前面了,前面是我们要不加在函数前面,要不加在参数前面,现在直接放在类前面了,那什么意思呢?简单来讲就是直接把这个类的构造方法声明成了一个implicit。的。
05:06
影视的,那如果构造方法生成init,那意思就是说我当前如果要是编译通不过的话,就有可能直接把当前数据。传给当前的这个构造,构造方法去做一个影视转换了,诶,那这个当然就更加的强大了,就相当于当前这个影视类里边定义的所有属性和方法我都可以用了啊,整体来讲的话,其实是之前我们讲到的影视函数的一个扩展。这就是关于skyla当中的影视转换,那有时候我们也会把这个影视转换叫做自动转换,那这里给大家再说一下,就是具体的影视解析的机制,这个影视解析的机制呢,就是首先我们先正常的编译器做一个编译,假如通不过,那要做二次编译,通不过二次编译的时候呢,首先是基于当前的代码作用域下查找影视的实体,所谓影视实体就是用implicit定义出来的影视函数,影视对象啊,影影视属性啊,影影视参数,还有影视类就主要就是这些东西,一般我们都是在当前代码域下找。
06:19
那如果还是找不到怎么办呢?那就继续在影视参数的类型的作用域里查找,类型的作用域指的就是跟当前类型相关联的全部的半生对象,以及所在包的包对象啊,那像之前我们看到的有很多影视定义的那个pie,它其实就是在我们当前的包包的这个包对象里面,对吧?啊,那所以当前我们查找的顺序就是这样。接下来我们就可以在代码里边做一个测试了。
我来说两句