2016-04-23 18 views
0

私は最大限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が含まれているため、カウンタの代わりに使用することはできません。

+0

現在の方法で懸念していることは何ですか? –

+1

GetAllUnits()を変更して、返す項目の最大数をパラメータとして受け入れることもできます。だから、GetAllUnits()内の 'if .. break'コードを効果的に移動する – tonypdmtr

+0

@tonypdmtr「すべて」という言い方が違うのですか? –

答えて

1

あなたは、コードのその部分の不可欠な性質を懸念している場合、あなたは常に通常の機能的なアプローチを使用することができます:あなたはLuaの中で非常にうまく機能プログラミングを行うことができます

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 

、しかし、あなたがする必要があります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 
関連する問題