0X11更复杂的函数
前置知识
正文
- 如果要定义接收多个变量的函数(注意不是任意个变量)。则把所有需要的形参写在形参列表里,用逗号隔开。例如
>
>function myFunc1(x1,x2,x3) return x1^2+x2^2+x3^2 end
>
调用的时候依次填实参,对应位置的实参会给对应位置的形参赋值。例如:
>>myFunc1(2,3,4)
>
这个函数调用大致相当于
>>x1,x2,x3=2,3,4
>x1^2+x2^2+x3^2
>
- 严格定义的函数只能有一个返回值。Lua中的函数看起来是允许返回多个值的。只要在return语句后边把要返回的多个值用逗号分开就行。
>
>function myFunc2(x) return x^2,x^3 end
>
调用的时候会返回x的二次方和三次方。如果要用赋值语句把返回值赋值给变量,也按多重赋值的规则。最多可以赋值给返回值个数个变量
>>a,b=myFunc2(5)
>
- 这一条是拓展知识,看不懂也没关系:Lua的函数能返回多个返回值,其实也可以在数学上有个合理的解释。数学上规定了函数只能有一个返回值,但是没有规定返回值必须是什么类型。所以可以先把要返回的多个量组装成一个向量,比如有34,12两个值要返回就组装成(34,12)。把这个向量返回还是只算一个返回值。返回之后再把向量拆开给多个变量赋值。Lua隐藏了中间步骤,所以看起来就能一次性返回多个返回值了。
- 要想把所有的计算都在return后的表达式中写明显然比较困难。数学上的方案是在函数里调用函数,例如:
>
>function sumSq(x,y) return x^2+y^2 end
>function myFunc3(x,y,z) return sumSq(x,y)+sumSq(y,z) end
>
这里的sumSq求两个变量的平方和。然后myFunc3又调用sumSq。
- 但是由于实际中Lua语言的解释器不一定能做到很好的优化。每一步算术都调用一层函数,当嵌套层次过深的时候会极大地消耗计算机资源。导致程序运行得很慢。我们可以把复杂度适中的多步运算打包到一个函数定义中。return语句的部分,也叫做函数体。函数体可以有多行语句,用回车分行就行了(就像分步算术中那样)。我们可以在这里定义新变量作为中间变量,执行运算和赋值。例如把第4点中的例子改写为一个函数:
>
>function myFunc4(x,y,z)
>a=x^2+y^2
>b=y^2+z^2
>c=a+b
>return c
>end
>
调用函数就会调用函数头(函数名和参数列表)之后,end之前的语句。
- 视频演示:定义多行函数体 https://www.bilibili.com/video/av14216200/
- 在函数定义中换行,Lua虚拟机的提示符会变成“...>”。在输入与开头function匹配的end之前,所有语句都不会执行,直到整个函数定义写完。
- 如果你执意要把所有代码写到一行也不是不可以。用分号;代替函数体中本来该换行的地方就可以了。但是这样代码可读性会非常差。
>
>function myFunc5(x,y,z) a=x^2+y^2;b=y^2+z^2;c=a+b;return c end
>
- 最后再补充一点。函数中可以出现任意个return语句。但是一旦执行到一个return语句,其后的所有语句都不再执行。函数返回返回值后结束。如果执行到与函数定义匹配的end都没有执行过return。那么将返回一个nil值(后续介绍nil)。
后续推荐