00:00
了解了scla当中的影视函数和影视类,那接下来我们再来讲一讲影视参数,既然它是参数,那自然是跟函数或者方法有关了。我们在定义SC拉里的一个函数或者方法的时候,可以对它的参数前面加上一个implicit关键字,表示这是一个影视参数。这样声明了之后呢,我们在调用函数的时候就可以不传参,而是让编译器在当前上下文作用域范围内去寻找我们定义的对应的影视值作为参数直接传入,这样我们在使用的过程当中就非常的方便了。接下来我们在代码里边做一个具体的测试。影视参数,但是参数吗?我们先定义一个函数吧,C hello里边给一个name作为参数函数,String类型。我们不需要返回,直接给一个unit,直接打印一行输出,非常的简单,A hello嘛,打声招呼哈,加上内。
01:08
定义的非常简单,那调用起来也非常容易,直接传一个name re类型的name,然后就可以得到hello Alice这样一个打招呼的过程,这个是非常简单的啊呃,那大家可能就想到了,如果这个时候我不想调用的时候啊,假如说这个爱ice丝我本身就应该是在别的地方直接定义出来的,我不想再调用的时候再把它传入,可不可以呢?啊,那当然如果你这里不传的话,现在是不行的,前我们有过一种可以调用的时候不传参的方式,那就是在声明函数的时候,可以给它一个默认值,哎,那所以这里边如果这里边前面我们定义了默认值的话,现在调用是没有任何问题的。同样可以输出hello Alice,那现在呢?呃,大家可能会想到,假如说啊,我们当前还有另外的一个方法。
02:04
比方说我们现在这个叫C2。比方说我们现在要的对应的这一个name。默认值也是爱丽丝,那大家可能就会发现了,我当然可以两个地方都传默认值,然后接下来下边调用的时候也非常简单了,就一遍一遍这样调用就可以了,是这样就看起来有点不方便啊,每一次都传一个默认值还是麻烦了,能不能我只在外边一个地方统一把它定义出来,后边所有的地方都不用传了呢?这种情况是可以做到的,那就是用我们的影视参数,比方说我在这里直接前面加一个implicit关键字。那么接下来我们在调用的时候呢,诶,大家看到这里边报错确实是可以不传它了,但是你至少得告诉我当前这个影视参数它的值到底到哪去找啊,现在我上下文范围内找不到对应的影视值定义,所以当然调用还是报错,那接下来我们就要看一看影视值同样定义的过程也是empressit,关键字在前面,后边呢,就是一个普通的分量或者常量的定义,我们直接比方说定义一个str运类型,它叫做Alice,哎,这个也是完全没有问题的。
03:27
是直接就可以把它作为当前的影视参数传入,大家可能会发现,哎,当前这个还是报错的呀,如果我们把它括小括号删掉正确了,哎,为什么是这样的呢?因为影视参数的定义在盖拉底层,它其实是一种颗粒化的表达,所以我们当前其实标准的定义应该是A哈。括号,括号表示正常,它是一个空参数的函数,然后呢,后边再用一个括号传入对应的影式参数,它是这样的,所以如果我们要是加上小括号的话,调用就完全没有问题是如果前面不加,大家知道省略小括号的话,我们在调用的时候也必须省略小括号才能调用,所以呃,就是我们前面不加小括号,那调用的时候这里也必须删掉,那如果说这里加上的话,当然删掉和不删都是可以的,之前我们讲的。
04:26
函数调用的时候的简略原则,那这样的话我们就可以看到同样可以输出hello Alice啊,这样的好处就在于下边我们也把它同一同样的译成implicit影式的啊,做一个调用完全没有问题了,所有的内容都可以在外边统一传入。那这里大家需要注意的是,我们看到了啊,这里的name和这里的str并不是相同的参数名称,所以我们在传递影视参数它的值的时候,上下文作用域范围内找的并不是相同的参数名,而是相同的类型,只要找到了一个string类型的影视值,那我们接下来的string类型的影视参数传的全是它。
05:16
啊,那当前既然有这样的一个定义,我们就发现了,是不是就不能有两个string类型的影视值啊,做一个声明啊,如果我们有这样的声明的话,那接下来肯定就。编译器就直接就混淆了,根本就不知道我到底要用的是哪个呀,哎,所以一定要注意。在同一作用域范围内,影视参数只能有一个。那另外可能我们还想到了,那前面我们不是说还可以传默认值吗?那如果定义了影视参数,它还可以传默认值进去吗?当然是可以的,比方说我们这里边直接给一个默认值,叫做at硅谷,那假如这里啊,我们不给。
06:05
如果啊,前面我们不给这个类,但是下边这个就不能调c hello了,我们直接看这个c hi是不是可以得到一个正确的结果,这是没有问题的,嗨,艾特硅谷,但这个时候如果我们要是同时传入影式参数的话,接下来我们看看它到底调的是谁呢?起来这两个都可以起作用,最终掉的还是Alice丝,也就是说影是值。这里边传入这个影视值会覆盖掉默认值的定义,它的优先级要更高。那这里大家可以注意,就是我们定义的过程当中啊。并不是说整个作用域范围内只能有一个影视值的定义,而是说需要有相同类型的值,影视值只能有一个。那如果说我们定义了不同类型的影视值的话,其实也是可以的。如我们重新定义一个implicit value,呃,我们把这个叫一个。
07:10
可以给一个整数,给一个18,这是完全没有问题的啊,那接下来我们同样可以把对应的这一个int类型的影视值作为一个in类型的影视参数,传递给其他的函数或者方法。那我们在调用的过程当中呢,还有另外一个简便的写法,我们这里可以说一下。因为可以发现啊,在这个定义的过程当中implicit,然后后边又给参数,给类型,又在作用域范围内去找,看起来好像很麻烦,而且既然这里根本不关心参数的名称,只关心类型,那是不是我直接可以把这个参数省略掉啊?哎,所以接下来我们可以看看这个简便写法怎么样去写,比方说这里边啊,我们直接给一个。
08:03
High unit,也就是说这里边我们high后边加的直接是当前的一个年龄啊inline,嗨,加上那之前我按照我们的想法,应该这里边implicit it in,这样的话可以在前面直接把对应的这个number传入了,哎,这个是没有问题的,我们可以直接在这儿定义一下,然后下边I做一个做一个调用,我们可以运行一下看一看。不出亥18,这是没有问题的,现在我们想要简略,怎么样简略呢?直接把定义全部删掉,那接下来在这里你必须要指明到底是要调用哪个类型的参数了,哎,所以这里边我们看到有一个特别的方法叫implicit。
09:00
后边呢,加一个泛型int,这样的话可以直接指明我们当前的调用是。想要拿到一个int类型的影视参数?Implicit里呢,底层其实是predict Di的一个方法,但它是一个阴line啊,内联内联函数,所以呃,我们这里边调用的时候,大家注意并不是使用了关键字,而是调用了定义好的一个函数。运行的话可以看到得到的结果还是一样的,嗨,18,这就是关于影视参数的讲解。
我来说两句