Lua表格的前n个元素循环

我有一个for循环,在其中我想执行的某些操作只要最多n次。到目前为止,我已经通过一个本地变量完成了这个操作,在循环中递增它,并每次检查是否超过计数器限制。如果是,我会退出循环。

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,因此不能将其用作计数器的替代品。

点赞
用户3677376
用户3677376

如果您关心那段代码的命令式本质,您可以随时使用常规的函数式方法:

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中,你可以很好地做函数式编程,但你需要在外部库中寻找常见的辅助函数如mapfilter,等等。在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
2016-04-25 01:05:29