太玄的lua课程
0X19分段函数
前置知识
正文
利用选择结构我们可以实现分段函数。例如,当x大于0时返回x^2,当x小于等于0时返回sin(x)-1。
>>require('math')
>function fun(x)
> if(x>0) then
> return(x^2)
> else
> return(math.sin(x)-1)
> end
>end
>
有的函数可能分为多段。Lua中解决这种问题有两种方法——选择结构嵌套和elseif分支。
首先描述一个需要多分支的函数:当x大于5的时候返回5,当x小于等于5但是大于2的时候返回2,其余情况下返回0。
所谓的选择结构嵌套就是把一个完整的if语句放到另一个if语句中then后部分或者else后部分。例如
>>if(x>2) then
> if(x>5) then
> return 5
> else
> return 2
> end
>else
> return 0
>end
>
当x大于2时,会再进行一次判断,看x是否大于5。(注意:虽然每个分支都有return,但是如果这个语句不放在任何函数内部,也是可以在交互式编程环境中执行的。)
内部选择结构也可以写在外部选择结构的else部分。这样在总的分支比较多的情况下比较方便查看和修改(虽然不能保证程序运行时经过的比较次数最少,折半查找等是比较高效的算法)。
每一层的if都只判断元素x是否属于本层对应的类。
如果不属于就交给else中嵌套的下一层if语句继续分类。
直到找到x所属的类或者最内层的if语句执行结束。
只用一个if语句也能完成多分支分类问题。这需要用到elseif关键字。它和else的不同有:
else一个句子中只能有一个,但是elseif可以有0到任意个。
elseif后可以像if后一样跟一个返回逻辑值的表达式,然后接then和条件满足时要执行的代码。(但是这并不像选择嵌套那样开始一个新的if语句。)
elseif写在then之后,else之前。
关于判断和执行:
如果if中的条件不成立。就会判断elseif中的条件。
如果有多个elseif,就按从上到下的顺序检测。直到出现一个表达式为真的情况,执行其后的代码。或者所有的elseif后的表达式都不为真。
如果if和所有elseif的表达式都不为真,则执行else后的代码。
注意:
多分支if语句只需要一个end。
else和elseif都是可选的部分,不一定要出现在每个if语句中。可以只有if,或者只有if和else,或者只有if和elseif。
一个四分支的函数。
>>function fun2(x)
> if (x>10) then
> print('>10')
> elseif(x>5) then
> print('>5')
> elseif(x>2) then
> print('>2')
> else
> print('<=2')
> end
>end
>
演示:多分支结构 https://www.bilibili.com/video/av15730856/
最后再聊一点代码风格的问题。一般要避免太多层的选择结构的嵌套。如果遇到选择结构嵌套先考虑一下它能不能通过把内外两层的判定条件用逻辑运算连接来实现目的。例如要判断一个数是否属于2到5的闭区间。可以用选择结构嵌套,外层判断是否小于5,内层判断是否大于2。也可以判断条件 x<=5 and x>=2 ,只用一个if(连elseif都不用)就能解决问题。
补充一点,如果if或者elseif后的表达式的值为nil,则效果和false一样。这同样适用于后续要介绍的循环结构中的判断循环条件的表达式。
后续推荐