在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 7
7的情况下使用),但这可能不是您要查找的。
false
,则更简单的方法是将变量放在第一位,默认变量放在最后。b = b or 7
b = b or 7
)的。