函数定义
lua 有两种定义函数的方法
function max(a, b)
return a > b and a or b
end
min = function(a, b)
return a < b and a or b
end
print(max(10, 20))
print(min(10, 20))
形参与实参
lua 函数的实参个数可以与形参不一致,实参少了则后面的参数为 nil,实参多了则舍弃多余的
min = function(a, b)
a = a or 1
b = b or 2
return a < b and a or b
end
print(min(5, 6, 7))
print(min(5, 6))
print(min(5))
print(min())
多重返回值
lua 函数可以返回多个返回值
* 只有当函数调用作为表达式的最后一个元素时才能返回多个值,否则就只有一个返回值
* 接收多个返回值和多重赋值、函数接收实参一样,少的赋 nil,多的舍弃
* 把函数调用放到一对()里面,可以迫使函数只返回一个值
* unpack 函数可以将一个数组中从 1 开始的元素取出来,5.1 之前unpack是全局函数,5.2 开始移到 table 下了
double = function(a, b, c)
a = a or 1
b = b or 2
c = c or 3
return a * 2, b * 2, c * 2
end
-- 多舍弃少补nil
x, y, z = double()
print(x, y, z)
a, b, c, d = double(10, 11, 12)
print(a, b, c, d)
m, n = double()
print(m, n)
-- 函数调用必须在表达式最后才能接收所有返回值
x, y, z = nil, nil, nil
x, y, z = double(), 10
-- 输出 2 10 nil
print(x, y, z)
-- 输出 2 10
print(double(), 10)
t = {double()}
-- 输出 3
print(#t)
t = {double(), 10}
-- 输出 2
print(#t)
function foo()
return double()
end
function foo2()
return double(), 10
end
-- 输出 2 4 6
print(foo())
-- 输出 2 10
print(foo2())
-- 输出 2
print((foo()))
t = {double()}
print(t)
print(table.unpack(t))
变长参数
- 使用 … 表示可变参数
- 固定参数要在可变参数前面
- lua5.1 之前可直接把 … 当成数组处理,5.2 之后必须先手动转成数组
- 如果变长参数中有 nil 值,必须使用 select 来获取参数的个数;select 函数第一个参数传入 n 时会返回变长参数的第 n 个元素,传入 ‘#’ 则会返回变长参数的个数
add = function(...)
local sum = 0
local arg = {...}
for i, v in ipairs(arg) do
sum = sum + v
end
return sum
end
print(add(1, 2, 3, 5))
foo = function(...)
local n = select(2, ...)
local count = select('#', ...)
return n, count
end
print(foo(1, 2))
具名参数
- lua 函数实参位置与形参位置要一一对应,函数不支持字典型的参数,如
foo(x = 10, y = 10)
是不合法的 - 如果要使用具名参数,即在调用函数时给每个参数一个 key 和 value,可以使用 table 的方式。把函数的参数设计成只有一个 table,然后 table 里面的值就可以指定键值了
-- print(x = 10, y = 10) -- error
oldPrint = print
print = function(arg)
local x = arg.x or 1
local y = arg.y or 1
local str = "x = " .. x .. " y = " .. y
oldPrint(str)
end
print({x = 10, y = 10})
print({y = 100})