| 脚本语法说明—函数 |
概述
● 函数的用途有:
完成指定的任务,这种情况下函数作为调用语句使用;
计算并返回值,这种情况下函数作为赋值语句的表达式使用。
● 语法
function func_name (arguments-list)
statements-list;
end;
● 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。
Eg:
uPrintf(8*9, 9/8)
a = uSin(3) + uCos(10)
备注:当函数只有一个参数并且这个参数是字符串或者表构造的时候,()是可选的。
Eg:
uPrintf "Hello World" <--> uPrintf("Hello World")
● UL函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足。
备注:形参,即函数定义时参数表中的参数;实参,即调用函数时传入的参数。
多重返回值
● UL函数可以返回多个结果值,比如uModf,其返回匹配串“开始和结束的下标”
Eg:
a,b = uModf(3.14)
uPrintf (a, b) --> 3 0.14
● UL函数中,在return后列出要返回的值的列表即可返回多值.
Eg:
function maximum ()
local mi = 10 -- maximum index
local m =8 -- maximum value
return m, mi
end
uPrintf (maximum()) --> 8 10
● UL总是调整函数返回值的个数去适用调用环境,当作为一个语句调用函数时,所有返回值被忽略。假设有如下三个函数:
Eg:
function foo0 () end -- 无返回值
function foo1 () return ’a’ end -- 返回一个值
function foo2 () return ’a’,’b’ end -- 返回两个值
● 当作为表达式调用函数时,有以下几种情况:
? 当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。
? 其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)
Eg:
x,y = foo2() -- x=’a’, y=’b’
x = foo2() -- x=’a’, ’b’ 被舍弃
x,y,z = 10,foo2() -- x=10, y=’a’, z=’b’
x,y = foo0() -- x=nil, y=nil
x,y = foo1() -- x=’a’, y=nil
x,y,z = foo2() -- x=’a’, y=’b’, z=nil
x,y = foo2(), 20 -- x=’a’, y=20
x,y = foo0(), 20, 30 -- x=’nil’, y=20, 30 被舍弃
● 函数调用作为函数参数被调用时,和多值赋值是相同。
Eg:
uPrintf (foo0()) -->
uPrintf (foo1()) --> a
uPrintf (foo2()) --> a b
uPrintf (foo2(), 1) --> a 1
uPrintf (foo2() .. "x") --> ax
● 函数调用在表构造函数中初始化时,和多值赋值时相同。
Eg:
a = {foo0()} -- a = {} (an empty table)
a = {foo1()} -- a = {’a’}
a = {foo2()} -- a = {’a’, ’b’}
a = {foo0(), foo2(), 4} -- a[1] = nil, a[2] = ’a’, a[3] = 4
变长参数
● UL函数可以接受可变数目的参数。UL将函数的参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数。
Eg:
uPrintfResult = ""
function uPrintf(...)
for i,v in ipairs(arg) do
uPrintf Result = uPrintf Result .. uTostring(v) .. "\t"
end
uPrintf Result = uPrintf Result .. "\n"
endl