gpt4 book ai didi

lua - LUA:寻求有效且无错误的分配默认参数的方法

转载 作者:行者123 更新时间:2023-12-04 17:02:35 27 4
gpt4 key购买 nike

我不想在函数定义中使用一长串参数,而是更喜欢传递一些固定参数和“其他参数”表,如下所示:

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

上面的代码在所有情况下都可以正常工作,除非我为浮雕传递了“false”:
doit( "Test text", { fontSize = 32, emboss = false } )

当我真的想要false时,以上代码将导致浮雕设置为true。

明确地说,我想要的是将第一个非NIL值分配给浮雕,相反,我得到的是第一个非false和non-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

最佳答案

Lua的关系运算符会求值其中一个操作数的值(即该值不被强制转换为 bool 值),因此您可以通过说a and b or c获得与C的三元运算符等效的值。在您的情况下,如果不是a,则要使用nil,否则要使用b,因此,a == nil and b or a:

local emboss = (params.emboss == nil) and true or params.emboss

不像以前那么漂亮,但是您只需要为 bool 参数做就可以了。

[snip - Lua code]

Now, this certainly works, but it seems so inefficient and over the top.

Please note: I found this ruby construct which looked promising and I am hoping lua has something like it:

[c,b,a].detect { |i| i > 0 } -- Assign first non-zero in order: c,b,a



您的Lua功能不再是多余的或效率低下的。就源文本而言,Ruby构造更为简洁,但是语义与 firstNotNil(c,b,a)并没有真正的不同。两种构造最终都会创建一个列表对象,并使用一组值对其进行初始化,然后通过一个线性搜索列表的函数来运行该对象。

在Lua中,您可以通过将vararg表达式与 select结合使用来跳过列表对象的创建:
function firstNotNil(...)
for i = 1, select('#',...) do
local theArg = select(i,...)
if theArg ~= nil then return theArg end
end
return nil
end

I am hoping there is a more compact way of doing this.



关于这样做的唯一方法是缩短函数名称。 ;)

关于lua - LUA:寻求有效且无错误的分配默认参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11298660/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com