00:00
我们已经了解了在scla当中怎么样用for推导式去实现一个范围便利啊,那大家看到在scla的语法当中确实是非常的简洁啊,只要这么一写一吐十,那它就表示I的这个选取范围,循环变量的选取范围是从一一直取到十啊,就是从一开始一二三四五六七八九十循环十次,那这样就解决了Java语法里边我们定义的时候到底包含不包含这个边界的考虑,哎,我们只要只要是按照一吐十这样一定义,那就肯定是从一到十都包含啊,那自然我们就想到了,有没有可能我们想要考虑的场景是我定义出这个边界来之后呢,最后不想包含这个边界,有没有这种场景呢?诶,当然是有的,那怎么样在这个放推导推导式里边实现这样一个需求呢?诶,有同学可能想到,那这个也简单,你干脆如果你要是不想包含十的话,你就干脆一吐九不就完了吗?哎,这样当然是可以的,但是有时候呢,我们的边界可能是要明确指出来的,但是它刚好就是不想包含,那怎么样去指定呢?其实大家看到看到之前我们做这个源码分析的时候啊,点到two里边的时候。
01:16
他最后返回的其实是in.inclusive这个内部类,这个inclusive表示什么意思,英文含义,它其实就是包含的意思嘛,那自然我们就知道了,它是指定了当前我的范围,就是要包含最后的结束位置and。啊,那呃,里边我们就看到这个range本身啊,它是有一个有一个属性就叫做is inclusive的,里边我们把它置为了处,那当然了,本身我们在里边is inclusive。可以看到啊,Range里边的inclusive定义的时候,默认它其实是false啊,所以本来这个边界末尾的这个边界其实应该是不包含的,哎,那所以大家就想到了,那如果说我不想要定义这样的一个边界,又应该怎么样去声明呢?用fo,呃,For推导是怎么样去定义它呢?哎,所以这里边其实是非常简单的啊,默认的这个认。
02:14
我们已经说到了,它不是直接定义的时候,默认就不包含这样的一个呃,And的边界吗?那所以我们可以直接用一个for推导式I有一个范围,便利一个范围,我干脆就可以直接扭一个range,然后里边呢,我给它的即始位置和它的终始位置一是。当然了,大家会看到这里边如果直接这么去定义的话,这是有问题的,因为后边定义range的时候,还应该要有一个对应的step啊,就是所谓的有一个不长啊,我们现在先不考虑这样的一个不长的问题啊,我们可以看到下边它有一个半生对象。
03:03
Range有一个伴生对象,它的真正要实现的时候,其实是调用后边的这个apply方法,Apply方法其实这里边可以传三个参数,也可以传两个参数,所以我们这里边你如果要声明range的时候呢,其实可以直接把new去掉啊,就相当于是直接使用了那个半生对象。那么它的这一个构造方法啊,相当于我们就是只传了两个参数传进来了,这样建出来的是一个什么样的认知呢?我们看一下这个源码里边,大家看调用这个apply方法是new了一个range,默认指定的这个step是一,然后呢,传进来的就是start和end,就是把我们的这个起始位置和结束位置传进来了,然后又出来的这个range,突然默认它就是不包含结束位置的,这个它是false对吧?啊那所以如果我们直接这么声明的话。下边再做一个这个定义,哎,为了弄清楚一点,我们还是把对应的分割线画出来,现在我们运行一下。
04:09
又可以看得很清楚。123456789只有九个了啊,那有同学可能想到,哎呀,这个就看起来不太明确呀,我怎么知道它底层我还得点到这源码里边才知道哦,它原来默认是不包含这个range的,那有没有更简单的方法呢?当然是有的,平常我们可以不用这种方法,而是用另外一个表达是更加明确的方法,那就是前置1TO10,那大家知道英文里边的to它是到达的意思,当然就当然就要包含最后的十,那如果要是不包含的话,那怎么办呢?哎,英文我们直接用until until大家知道是直到的意思,那也就是说从一开始直到十,到十就结束了,那所以当然十就是一个边界条件,它是不包含的,所以如果直接这么写的话,也是可以实现我们对应的这样一个需求的。
05:03
直接运行可以看到。一到九只输出九次,Hello word啊,那当然了,这个n until其实跟前面的to类似,那句的话它也是一个方法调用reach in,下面的方法调用它是什么呢?哎,我们看到了它的底层其实就是range,然后传了两个参数嘛,就是刚才我们上面的这种实现方式啊,那这里边的这个range其实就是大家看要用的就是。诞生对象的apply方法啊,那关于这个机制,这其实是伴生对象的一个特性啊,就是创建它的对象的时候,默认就要调这里的apply方法啊,那大家看这里就是new了,一个range了,那当前传进来的这个参数,这里面的self and又表示什么含义呢?哎,这就涉及到我们前面这个reach做转换时候的这个定义了,大家还记得之前我们那个a a dif里边。
06:02
我们曾经有一个。曾经有一个。Interupper去做这样的一个包装,在这个包装的过程当中,我们会发现把当前的int类型的数值会作为参数传给reach这个类的构造方法,哎,那所以在reach in里边,大家看这个构造方法,它就是把它作为self参数的一个属性来使用的啊,所以接下来我们看到的self呢,就是当前调用。当前调用方法的那个self对吧,所以就是当前谁调用呢?诶是一调用一转换成reach之后,它的self当然就是一了啊,那当前我们的这个要要调用的这个to方法或者n until方法,当然当前也是self就是一,那同样传进来的这个参数,N until的参数或者to的参数,这个当然就是and了啊,所以接下来大家看我。
07:05
传传给这个range构造方法里面的self and,其实就是一和十,就是我们的起始和结束位置于于是在后边我们看到apply方法里边呢,我把它叫做了start和and啊,这样的话,从底层的源码进行分析,我们就会更加容易理解到底是怎么样去实现这样一个范围便利的啊,这是关于不包含边界的范围便利,大家也可以把它做一个尝试。
我来说两句