定义函数参数的默认值

在Lua wiki中,我find了一种为缺less参数定义默认值的方法:

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的很多地方都可以看到,例如IUPLua中LuaSocket协议模块和构造函数的高级forms 。)

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

 function myfunction(t) setmetatable(t,{__index={b=7, c=5}}) local a, b, c = t[1] or ta, t[2] or tb, t[3] or tc -- function continues down here... end 

参数表中缺less的任何值都将从其metatable的__index表中获取(请参阅metatables上的文档 )。

当然,使用表格构造函数和函数可以使用更高级的参数样式,您可以编写任何您需要的东西。 例如,下面是一个函数,该函数构造一个函数,该函数从定义参数名称和默认值的表以及采用常规参数列表的函数中获取名称或位置参数表。

作为非语言级function,可以更改此类调用以提供新的行为和语义:

  • variables可以被接受多个名字
  • 位置variables和关键字variables可以散布 – 定义两者可以优先于(或导致错误)
  • 只有关键字的无位置variables,以及无名的位置
  • 相当详细的表结构可以通过parsing一个string来完成
  • 参数列表可以逐字使用,如果函数被调用除了一个表以外的东西

编写参数转换器的一些有用函数是unpack (移到5.2中的table.unpack ), setfenv (在5.2中用新的_ENV构造不推荐使用),并select (从给定参数列表返回单个值,用'#'列表)。

在我看来,没有别的办法。 这只是Lua的心态:没有任何装饰,除了一些句法糖,没有多余的方式来做简单的事情。

从技术上讲,有b = b == nil and 7 or b (这应该用在false为有效值为false or 7为7的情况下),但这可能不是你要找的。

到目前为止我发现的唯一方法就是做这样的事情:

 function new(params) params = params or {} options = { name = "Object name" } for k,v in pairs(params) do options[k] = v end some_var = options.name end new({ name = "test" }) new()