在Lua中,函数是一种对语句和表达式进行抽象的主要机制。函数既可以完成某项特定的任务,也可以只做一些计算并返回结果。
Lua具有一项非常于总不同的特征,允许函数返回多个结果:
s, e = string.find("Hello Lua users", "Lua") print(s, e) -->7 9
以Lua编写的函数同样可以返回多个结果,只需在return关键字后列出所有返回值即可:
function maximum (a) local mi = 1 --最大值的索引 local m = a[mi] --最大值 for i, val in ipairs(a) do if val > m then mi = i; m = val end end return m, mi end print(maximum({8, 10, 23, 12, 5}) -->23 3
关于多重返回值还要介绍一个特殊函数--unpack。它接受一个数组作为参数,并从下标1开始返回该数组的所有元素:
print(unpack{1, 2, 3}) -->1 2 3 a, b = unpack{1, 2, 3} -->a=1, b=2, 3被丢弃
Lua中的函数还可以接受不同数量的实参:
function add(...) local s = 0 for i, v in ipairs{...} do s = s + v end return s end print(add(3, 4, 10, 25, 12)) -->54
参数表中的3个点(...)表示该函数可接受不同数量的实参。实际上,还可以通过变长参数来模拟Lua中普通的参数传递机制,例如:
function foo(a, b, c) --可以转换为: function foo(...) local a, b, c = ... end
Lua提供了专门用于格式化文本(string.format)和输出文本(io.write)的函数。很自然地会想到将这两个函数合二为一:
function fwrite(fmt, ...) return io.write(string.format(fmt, ...)) end
--调用 参数 fwrite() fmt = nil,没有变长参数 fwrite("a") fmt = "a",没有变长参数 fwrite("%d%d", 4, 5) fmt = "%d%d",变长参数为4和5
在Lua中,函数是一种“第一类值”,这表示在Lua中函数与其他传统类型的值具有相同的权利。函数可以存储到变量中或table中,可以作为实参传递给其他函数,还可以作为其他函数的返回值。
在Lua中有一个容易混淆的概念是,函数与所有其他值一样都是匿名的,即它们都没有名称。当讨论一个函数名是(例如print),实际上是在讨论一个持有某函数的变量。
a = {p = print} a.p("Hello World") -->Hello World print = math.sin --‘print‘现在引用了正弦函数 a.p(print(1)) -->0.841470 sin = a.p --‘sin‘现在引用了print函数 sin(10, 20) -->10 20
时间: 2024-10-14 11:17:45