00:00
我们了解了一下在skyla语法里边的if else,大家其实会发现这跟Java,甚至跟C基本上没有什么区别嘛,哎,所以这个其实是非常简单的,那在scla里边这个条件分支判断ES有没有什么特别的地方呢?诶,还真有在scla里边啊,前面我们说到scla里边的每一个表达式其实都是有它具体的值的,然后我们可以判断它这个值的类型,把它赋值给一个变量,那这里的if else这样一个条件分支语句,它其实本身也是有返回值的,或者说如果我们把它看成一个完整的表达式的话,这个表达式本身也是有值的。哎,大家可能会觉得这个比较难以理解啊,抓到里边并没有这样的概念,你这个if这个分支难道不就是一个流程控制吗?你不就是按照顺序执行里边的代码块就完了吗?怎么它还有返回值呢?Scala里边确实是定义了这样的一个返回值,它的返回值定义成什么呢?
01:02
定义成当前这个分支代码块里边的最后一行表达式的值,哎,所以对于我们上面的这一部分代码,大家可能就发现了啊,这里边我们直接最后一行都是print line,就是if也是print line else也是print line,那它的返回,返回的值应该是什么呢?当然就是一个unit了,Unit只有一个对象,就是我们说的那个空括号嘛,所以如果我们要把这个表达式的值赋给一个变量的话,打印出来当然就是一个空括号了啊,所以这里我们可以直接把这个复制一下,大家测试一下,看一看这个结果怎么样。接下来我们测试的是分支语句的回值,或者大家把它看成表达式的话,就是它这个表达式的值直接复制过来,那接下来大家可以看到,如果我们随便定义一个变量啊,叫做result的话,那么这个result类型应该是什么呢?它其实就应该是unit。
02:06
现在如果我们要是把它做一个打印输出result,我可以看到它的值其实就是一个啊,Unit对应的那个对象就是一个空括号,前面我们还是把这个做一个分界线,分割线更清楚一点,然后运行一下。我们随便还是给一个比方说19岁看,最后result就是一个空括号,当然了,这里边我们该输出还是会输出,一句话还是会输出,青少年这里面print line肯定是要执行的,但是最后它的结果呢,就是一个空括号。啊,那大家可能会想到了,如果要是这样的话,我们最后想要让这个result里边有值,那又应该怎么办呢?诶,当然大家自然就想到了,就是当前这个代码块里边的最后一句话,最后一行代码应该它的表达式得是一个我们想要的那个东西,比方说我们这里边输出的不想要他到底属于一个年龄段的那个string,比方说我就想要到底是童年还是青年,还是中年老年,那这个时候怎么办呢?诶大家看我把它类型改成string之后,这里就报错了,为什么呢?因为当前每个代码块最后一行。
03:23
它都是一个unit返回呀,Print line,这是没有返回值的嘛,那现在怎么办呢?其实非常简单,我只要最后一行解一个字符串童年,那当前这个if代码框,它的返回值就是最后一行就是这个童年啊,所以如果要是这样走到这个if这个条件分支判断里边来的话,最后我们得到的result就应该是童年,它是一个string,这个是没问题了。啊,那大家会想到,那这不对啊,因为现在是if else有多个分支,那是不是相当于我们每个分支都应该返回一个string,最后才能保证它一定返回一个string啊,啊,要不然的话,你当前这个走if这个分支可以返回一个string,那别的分支还是unit,这没办法保证最后的结果一定对呀,所以如果要想实现这个功能,我们需要在每一个分支的最后一行都返回一个自己想要的对应的这样的一个值。
04:24
所以每一个分支啊,我们把这个字符串都copy出来,放在下边,这样的话,现在我们再去执行一下。比如说现在我们可以直接给一个大一点的数啊,比方说给一个36,大家可以看到我们最后执行判断出它是今年,而且最后result的值也就变成了一个字符串,它真的是中年了。这就是关于当前这个if else分支语句返回值的这样的一个概念,一个定义啊,那当然了,就是对于这个if else呢,它一般情况下,我们这里边都是它是什么样的值,我们就应该是定义它的类型是什么,是string,对吧?这里有一种比较特殊的用法是,我可以要求当前这个,就即使它的最后一行是一个string,但是呢,我也可以直接指定我要求它有返回值,像我这里边直接给一个unit是对的,这个他不会报错。
05:24
可能大家觉得这个有点有点奇怪,对吧,因为unit类型和string类型大家知道一个是值类型,一个是引用类型,它们俩是互相肯定不兼容的,那你这个时候前面我们如果定义result是string类型,你最后如果返回是一个unit,它直接报错了,那现在怎么定义它是unit,最后返回string它不报错呢?诶这个它是允许的,就是我允许,尽管最后一行是一个string,但是我要求它不返回值。它是空,这个是可以做到的啊,但是你不能说我要求返回string的时候,结果最后给我一个空就反过来就不成立了啊,大家也可以运行一下,看看这个效果怎么样。
06:03
现在我们再去输入一个36,可以看到现在的话,同样这个中年还会正常的执行一次print line,但是最后的result就变成了一个空空括号啊,这就是我们关于这个返回值的一个定义,那这里边还会有另外的一个问题,就是。那假如说我们当前的这个定义有所不同呢,那就是如果说我当前这个定义的时候,比方说有一些分支条件下啊,我这里边是直接输出了这个童年青少年对应的这个string,那有些分支呢,我不想输出对应的这个这个值之前我们这个是string的一个返回,那有些比方说这个已经是成年之后,我可能要考虑的就是。不是年龄段了,我要考虑他具体的年龄到底是多少,那所以这个时候呢,那大家想我怎么样返回这个具体的年龄呢?很简单,直接把值作为最后一行也返回不就完了吗?是这里面出现了另外一个问题,就是如果这样去写的话,那返回值就变成了一个int了,Int我们这里边要求的string显然是不兼容的。
07:11
那这个又该怎么办呢?哎,这个其实也简单,你有些分支是string,有些分支是int,那最后我们整体的返回值应该给什么?当然就是应该给一个他们的公共副类了啊,那这里大家可能知道,呃,这个童年这样的一个string,它本身是一个引用类型,它是any reference,而这里的int类型呢,是一个值类型,是一个any value,那这种情况下它彼此是不兼容的,那我们最后应该给什么呢?那就只能给到这我们那个整个类型系统里边啊呃,类型数结构里边的根上的那个结构,安妮。如果给这的话,它就不会报错了啊,所以这里面我们也可以直接做一个运行。大家看这里如果要是给一个19岁,那么大家看这里是青年,然后输出了一个19,当然呃,这是如果成年的话,是这样的一个效果,那如果说这里边如果未成年的话,我们看输出的还是一个string,还是青少年给我们需要用它的公共父类把它做一个实现。
08:18
啊,这就是关于分支语句返回值的一个用法,呃,那这样的一个用法,大家看它其实有一个非常好的好处,就是我直接根据这里的一个条件判断,其实有时候我们对于一个变量赋值就是要有一个条件,然后根据一个条件判断去给它赋一个值的,对吧?这里我们这个看的就非常的明显嘛,我们当前的这个result,其实就是他的一个年龄段的那个指标嘛,那其实就是根据age要做一个多条件的判断啊,那在有一些场景里边呢,这种写法还可以做的更加的省略啊,大家可以想到就是,呃,我我们之前在这个Java里边其实有一个比较特殊的用法,就是Java中有一个单元运算法,大家应该还记得吧,这三元运算符它是某一个啊变量或者一个表达式啊,然后后边一个B啊,我们一个这。
09:18
呃,逻辑条件判断就是一个条件表达式啊,一个逻辑表达式,然后判断它是否为真,如果为真的话它的值,那如果为假的话是C啊,所以有时候我们经常用这样的一个三元运算符做一个赋值啊,就是我们复制一个变量的时候呢,判先判断一个条件,然后如果为真那就给B,如果为假就给C,这是之前这个Java里面比较有特色的一个一个用法啊,但是大家会想到,呃,这个用法呢,就是它代码很简洁,一行就直接搞定了,但是呢,如果大家要是对这个语法不熟悉的话,可能看到之后就会就就得想半天,有可能可读性不是那么的好。
10:00
啊,那所以大家就会发现,其实这个我如果要是展开写的话,也可以实现,怎么实现呢?这不就是一个条件判断,那就是if else嘛,哎,所以大家自然想到了,在Java里边呢,我没有直接这个返回值的这种定义,那我就必须怎么样呢?比方说在外面啊,我定义一个变量,呃,定义一个result,那然后接下来我就判断一个条件,按照我们刚才的这个定义啊,啊,假如说这个三元运算符,那其实就是只是一个双分支嘛,那我就直接在外边定义一个result,然后呢,If h大于等于18,这里边result等于成年,然后else的话,Result等于未成年,这也是也是可以实现的呀,那现在我们skyla有了这样的一个。返回值的定义的话,那就不用这么麻烦了,哎,大家发现对于我们前面的这个判断。是不是直接可以,哎,我还是就叫S吧,前面定义了result,我们这里直接定义一个rest就好了。
11:02
这里叫做成年,下面这个叫做未成年,那我直接用这样一个条件也可以直接得到这样一个string吗?诶,所以这个其实是效果是一样的,但是大家会看到这样就看起来没有Java里边那么简洁,那其实这个也可以进一步的去做一个缩减,在这个SKY拉里边,它这个语法可以直接缩减成什么呢?首先这个类型我可以直接省略,这是没问题的啊,然后接下来样还是if做一个条件判断,A如果大于等于18的话,大家看后边的这一个花括号里边如果只有一行代码的话。这个花括号可以省略啊,这个其实之前Java里面也有这样的用法,对吧?啊,这个直接就可以省略了,然后呢,Scda里边允许我们直接把所有的这一个代码都写在同一行,跟在后边,所以接下来就变成了if h大于等于18成年,然后到此。
12:02
未成年,所以大家看这个代码是不是非常的简洁啊,当然这里我们要给一个不同的名称就非常的简洁啊,那所以里边我们得到这个效果,大家看跟前面的这个三元运算符是不是非常类似啊,我们这里原先这个如果要直接这么写的话,大家可能也会想到我得用string result。等于,等于什么呢?前面做一个判断,A大于等于18,然后后面对应的这个值对吧?前面这个是成年,后边是未成年,那我们现在只是把这个改成了是加了一个if啊,然后后边这里就不需要这个问号了,然后呢,后边这个冒号用了一个else。整个语法结构上其实是非常的类似,而且同样简洁,另外还有一个显著的特点就是代码可读性更强了,大家如果要不熟悉语法的话,你看这个得想半天,但是如果你看这句话的话,这跟我们说一个就是常规的一个语言文本是一样的嘛,那就是if这个A如果大于比18岁大于等于的话,那这个RESULT2就是成年,那else如果不是的话,那就是未成年。
13:16
所以大家可以看到skyla的设计思想就是它要让我们的语义表达更加的简洁,而且更加的符合程序员使用的习惯,让代码的可读性要更强,用这种方式就可以实现Java里边三元运算符的这种这种方法啊,那所以SKY里边并没有这样的三元运算符,但是用这样的方式可以同样把它实现,而且还更加呃容易理解,代码可读性更强。
我来说两句