在 Lua wiki 中我找到了一种为缺失参数定义默认值的方法:
function myfunction(a,b,c)
b = b or 7
c = c or 5
print (a,b,c)
end
这是唯一的方法吗? PHP 风格myfunction (a,b=7,c=5)
似乎不起作用。并不是说 Lua 方式不起作用,我只是想知道这是否是唯一的方法。
如果您想要命名参数和默认值(如 PHP 或 Python),您可以使用表构造函数调用函数:
myfunction{a,b=3,c=2}
(这在Lua的很多地方都可以看到,比如LuaSocket协议模块的高级形式 http://w3.impa.br/~diego/software/luasocket/http.html和构造函数IUPLua http://www.tecgraf.puc-rio.br/iup/.)
函数本身可以有这样的签名:
function myfunction(t)
setmetatable(t,{__index={b=7, c=5}})
local a, b, c =
t[1] or t.a,
t[2] or t.b,
t[3] or t.c
-- function continues down here...
end
参数表中缺少的任何值都将从__index
表在其元表中(参见关于元表的文档 http://www.lua.org/manual/5.1/manual.html#2.8).
当然,可以使用表构造函数和函数来实现更高级的参数样式 - 您可以编写您需要的任何内容。例如,here https://gist.github.com/975399是一个函数,它构造一个函数,该函数从定义参数名称和默认值的表中获取命名或位置参数表,以及一个采用常规参数列表的函数。
作为非语言级功能,可以更改此类调用以提供新的行为和语义:
- 可以使变量接受多个名称
- 位置变量和关键字变量可以散布 - 并且定义两者可以优先考虑其中一个(或导致错误)
- 可以创建仅关键字无位置变量,以及无名仅位置变量
- 相当详细的表构造可以通过解析字符串来完成
- 如果使用 1 个表以外的其他内容调用函数,则可以逐字使用参数列表
编写参数翻译器的一些有用的函数是unpack
(搬到table.unpack
在 5.2 中),setfenv
(在 5.2 中已弃用,新版本已弃用)_ENV
建筑),以及select
(它从给定的参数列表返回单个值,或者列表的长度'#'
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)