我想实现一个函数,该函数从传递给它的变量中返回第一个非空字符串。不幸的是,一些变量可能是零,所以很自然的做法如何创建一个返回传递给它的第一个非零,非空字符串的函数?
function first_non_empty(...)
for i, item in ipairs({...}) do
if item ~= nil and item ~= '' then
return item
end
end
return ''
end
不起作用:ipairs尽快退出了,因为它遇到一个零值。这可以通过改变需求来修改,以便变量不能为零,或者通过将长度传递给函数,因此表长度不必依赖于ipairs
,或者通过将所有参数封装在函数中,他们明确没有
function first_non_empty_func(...)
for i, func in ipairs({...}) do
local item = func()
if item ~= nil and item ~= '' then
return item
end
end
return ''
end
function fn(p)
local f = function() return p end
return f
end
-- change callers to first_non_empty_func(fn(a), fn(b), fn(c))
但是,这些解决方案都使函数原型复杂化。是否存在一个采用有序参数列表的函数,其中一些参数可能为零,它将返回非零的非零参数和不为空字符串的第一个参数?
不错!作为奖励,因为'select'在5.1中出现,而'table.pack'不在,我可以在Scribunto中使用它。 –
@ChrisMidgley'函数table.pack(...)return {n = select('#',...),...} end'就是全部。对于long vararg列表,重复复制'select'调用的列表可能比创建一次表并慢慢迭代要慢。另一方面,创建需要稍后垃圾回收的表可能会变慢。所以基准测试可以看出哪一个在你的案例中更快(或者只是选择你认为更清洁的一个,直到你看到速度实际上是一个问题)。 – nobody