在Lua wiki中我找到了一种方法来定义缺少参数的默认值:
function myfunction(a,b,c) b = b or 7 c = c or 5 print (a,c) end
这是唯一的办法吗? PHP样式myfunction(a,b = 7,c = 5)似乎不工作。不是Lua的方式不工作,我只是想知道这是否是唯一的方法。
解决方法
如果你想要命名参数和默认值,如PHP或Python,你可以使用表构造函数调用你的函数:
myfunction{a,b=3,c=2}
(这在Lua的许多地方看到,如the advanced forms of LuaSocket’s protocol modules和IUPLua的构造函数。)
函数本身可以有这样的签名:
function myfunction(t) setMetatable(t,{__index={b=7,c=5}}) local a,c = t[1] or t.a,t[2] or t.b,t[3] or t.c -- function continues down here... end
参数表中缺少的任何值都将从其Metatable中的__index表中获取(参见the documentation on metatables)。
当然,使用表构造函数和函数可以使用更高级的参数样式 – 你可以写任何你需要的。例如,here是构造从定义参数名称和默认值的表中获取命名或位置参数表的函数的函数,以及采用正则参数列表的函数。
>可以使变量接受多个名称
>位置变量和关键字变量可以是散布的 – 并且定义两者可以优先(或导致错误)
>可以进行关键字无位置变量,以及无名位置
>相当冗长的表构造可以通过解析字符串来完成
>如果函数使用除了1表以外的函数调用,则可以逐字使用参数列表
一些用于写参数翻译器的有用函数是unpack(在5.2中移动到table.unpack),setfenv(在5.2中用新的_ENV结构不推荐使用)和select(返回给定参数列表中的单个值,列表与’#’)。