2016-04-23 10 views
0

Ich habe eine for-Schleife, in der ich einige Aktion mache, die ich nur maximal n mal machen möchte. Bisher habe ich dies mit Hilfe einer lokalen Variablen gemacht, die ich in der Schleife inkrementiere, und jedes Mal überprüfe, ob es das Zählerlimit überschritten hat. Wenn es so ist, breche ich aus der Schleife.Schleife über die ersten n Elemente von Lua Tabelle

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 

Ich bin sehr neu zu Lua und frage mich, ob es einen besseren Weg gibt, dies zu tun. Es ist wichtig, dass ich keine Kopie der Tabelle oder eine andere teure Operation erstelle.

Beachten Sie, dass die _ die ID der Einheit enthält, so dass diese nicht anstelle des Zählers verwendet werden kann.

+0

Was beschäftigt Sie mit Ihrer aktuellen Methode? –

+1

Sie können GetAllUnits() auch ändern, um als Parameter die maximale Anzahl der zurückzugebenden Elemente zu akzeptieren. Also, du verschiebst effektiv den 'if .. break' Code in GetAllUnits() – tonypdmtr

+0

@tonypdmtr Äh, bedeutet "All" nicht etwas anderes? –

Antwort

1

Wenn Sie besorgt über die Unabdingbarkeit dieses Stück Code, können Sie immer die üblichen funktionalen Ansätze verwenden:

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 

Sie funktionale Programmierung in Lua ganz schön tun, aber Sie werden müssen Suchen Sie nach den üblichen Hilfsfunktionen wie map, filter usw. in einer externen Bibliothek. Es gibt viele Implementierungen dieser Funktionen im Repository LuaRocks, aber in Ihrem Fall müssen Sie sicherstellen, dass Sie eine Version erhalten, die auf Iteratoren statt (oder zusätzlich zu) Tabellen funktioniert. Wenn Sie nichts passendes finden, können Sie die folgenden Funktionen verwenden:

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 
Verwandte Themen