Lua 函数

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值