定义函数参数的默认值

在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 modulesIUPLua的构造函数。)

函数本身可以有这样的签名:

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(返回给定参数列表中的单个值,列表与’#’)。

相关文章

1.github代码实践源代码是lua脚本语言,下载th之后运行thmai...
此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/...
Rime输入法通过定义lua文件,可以实现获取当前时间日期的功能...
localfunctiongenerate_action(params)localscale_action=cc...
2022年1月11日13:57:45 官方:https://opm.openresty.org/官...
在Lua中的table(表),就像c#中的HashMap(哈希表),key和...