Lua中的函数参数如果是string或表构造器,则圆括号可以忽略掉。
print "Hello World" <--> print("Hello World")
dofile 'a.lua' <--> dofile ('a.lua')
print [[a multi-line <--> print([[a multi-line
message]] message]])
f{x=10, y=20} <--> f({x=10, y=20})
type{} <--> type({})
Lua也提供了一种语法像o:foo(x)
同等于o.foo(o,x)
,将第一个参数自动填写为o。
Lua的实参和形参个数也提供了像多重赋值一样的机制,多余的实参自动被抛弃,多余的形参自动补为nil。
1.返回多个值
s, e = string.find("hello Lua users", "Lua")
print(s, e) --> 7 9
function maximum (a)
local mi = 1 -- index of the maximum value
local m = a[mi] -- maximum value
for i = 1, #a do
if a[i] > m then
mi = i; m = a[i]
end
end
return m, mi
end
print(maximum({8,10,23,12,5})) --> 23 3
如果函数调用不是在多重赋值列表中的最后一个非空元素,通常会取函数返回值的第一个值:
foo2返回”a”、”b”则有:
x,y = foo2(), 20 -- x="a", y=20
你可以通过原括号,强制接收一个返回结果:
print((foo2())) --> a
由于C语言的可变参数个数函数参数只能接受固定个数的实参,所以可以使用table.unpack()来完成这一任务:
print(table.unpack{10,20,30}) --> 10 20 30
a,b = table.unpack{10,20,30} -- a=10, b=20, 30 is discarded
table.unpack的lua实现如下:
function unpack (t, i, n)
i = i or 1
n = n or #t
if i <= n then
return t[i], unpack(t, i + 1, n)
end
end
2.可变参数
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
function fwrite (fmt, ...)
return io.write(string.format(fmt, ...))
end
pack是lua5.2才有的语法,用于将参数打包:
function nonils (...)
local arg = table.pack(...)
for i = 1, arg.n do
if arg[i] == nil then return false end
end
return true
end
print(nonils(2,3,nil)) --> false
print(nonils(2,3)) --> true
print(nonils()) --> true
print(nonils(nil)) --> false