我有一个for循环,我正在做一些我最想做的动作。到目前为止,我已经通过一个局部变量完成了这个,我在循环中递增,每次检查它是否超过了计数器限制。如果确实如此,我就会摆脱循环。
for _,u in GetAllUnits() do
if not u:IsInCategory("STRUCTURE") and not u:IsInCategory("COMMAND") then
NameUnit(u)
nameCount = nameCount + 1
if nameCount >= maxUnitNames then break end
end
end
我对Lua很新,并想知道是否有更好的方法来做到这一点。重要的是,我最终不会创建表的副本或其他一些昂贵的操作。
请注意_
包含单位的ID,因此不能使用此代替计数器。
答案 0 :(得分:1)
如果您担心该段代码的必要性,您可以始终使用通常的功能方法:
local function notStructureNotCommand( _, u )
return not u:IsInCategory( "STRUCTURE" ) and
not u:IsInCategory( "COMMAND" )
end
for _,u in take( maxUnitNames, filter( notStructureNotCommand, GetAllUnits() ) ) do
NameUnit( u )
end
你可以在Lua中很好地进行函数式编程,但是你必须在外部库中寻找常用的辅助函数,如map
,filter
等。在LuaRocks存储库中有很多这些函数的实现,但在你的情况下,你必须确保你得到一个适用于迭代器而不是(或附加)表的版本。如果您找不到合适的内容,可以使用以下功能:
local filter
do
local function filter_helper( pred, f, s, var_1, ... )
if var_1 ~= nil then
if pred( var_1, ... ) then
return var_1, ...
else
return filter_helper( pred, f, s, f( s, var_1 ) )
end
end
end
function filter( pred, f, s, var )
return function( st, v )
return filter_helper( pred, f, st, f( st, v ) )
end, s, var
end
end
local function take( n, f, s, var )
return function( st, v )
if n > 0 then
n = n - 1
return f( st, v )
end
end, s, var
end