在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方法行不通,我只是想知道这是否是唯一的方法。
Answers:
如果需要命名参数和默认值(例如PHP或Python),则可以使用表构造函数调用函数:
myfunction{a,b=3,c=2}
(这在Lua的很多地方都可以看到,例如LuaSocket协议模块的高级形式和IUPLua中的构造函数。)
函数本身可以具有如下签名:
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其元表中的表中获取(请参阅有关metatables的文档)。
当然,使用表构造函数和函数可以使用更高级的参数样式-您可以编写所需的任何内容。例如,这里的函数构造一个函数,该函数从定义参数名称和默认值的表中获取命名或位置参数表,以及一个带有常规参数列表的函数。
作为非语言级别的功能,可以更改此类调用以提供新的行为和语义:
编写自变量转换器的一些有用函数是unpack(table.unpack在5.2中移至),setfenv(在5.2中使用新_ENV结构弃用)和select(从给定参数列表返回单个值,或使用返回列表的长度'#')。
x or default,此回复中还使用的表达式并不是真正等同于参数默认值,而只是一种简单的变通方法,仅当nil和false均为无效参数值时才起作用。假设布尔参数的默认x值为true,而调用方则传递一个explicit false。然后x or true给出true,即使false已明确传递。更好的版本是if x == nil then x = default end,它也更易读。它仍然不能处理显式nil参数。
我认为没有别的办法。那只是Lua的心态:没有多余的装饰,除了一些语法糖以外,没有多余的方式来做简单的事情。
从技术上讲,存在b = b == nil and 7 or b(应该在false有效值为false or 77的情况下使用),但这可能不是您要查找的。
false,则更简单的方法是将变量放在第一位,默认变量放在最后。b = b or 7
b = b or 7)的。