而不是在我的函数定义中使用长长的参数列表,我更喜欢传递一些固定参数和一个“附加参数”表,如下所示:
function:doit( text, params )
end
这很好,因为它允许我稍后添加新的命名参数而不会破坏旧调用。
当我尝试为某些参数强制使用默认值时,会出现我遇到的问题:
function:doit( text, params )
local font = params.font or native.systemBold
local fontSize = params.fontSize or 24
local emboss = params.emboss or true
-- ...
end
上面的代码在所有情况下都可以正常工作,除非我为浮雕传递了“假”:
doit( "Test text", { fontSize = 32, emboss = false } )
当我真的想要 false 时,上面的代码会导致 emboss 被设置为 true。
需要明确的是,我想要的是将第一个非 NIL 值分配给浮雕,而不是我得到第一个非假和非 NIL。
为了解决这个问题,我编写了一小段代码来查找表中的第一个非 NIL 值并返回:
function firstNotNil( ... )
for i = 1, #arg do
local theArg = arg[i]
if(theArg ~= nil) then return theArg end
end
return nil
end
使用此功能,我将重写浮雕分配,如下所示:
local emboss = firstNotNil(params.emboss, true)
现在,这当然有效,但它似乎效率低下且过于夸张。我希望有一种更紧凑的方式来做到这一点。
请注意:我发现这个 ruby 结构看起来很有希望,我希望 lua 有类似的东西:
[c,b,a].detect { |i| i > 0 } -- Assign first non-zero in order: c,b,a