循环遍历Lua表的前n个元素

时间:2016-04-23 21:57:28

标签: loops lua

我有一个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,因此不能使用此代替计数器。

1 个答案:

答案 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中很好地进行函数式编程,但是你必须在外部库中寻找常用的辅助函数,如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