2016-10-14 5 views
2

私は値がarmyNameであり、それが8つの値のいずれかであるかどうかをチェックする関数が必要です。私がLuaを初めて知りましたので、私はこのようなチェックをする最良の方法が何であるかを探しています。変数がLuaのいくつかの値のいずれかであるかどうかを確認

これは動作します:

local function isPlayerArmyName(armyName) 
    return armyName == "ARMY_1" 
     or armyName == "ARMY_2" 
     or armyName == "ARMY_3" 
     or armyName == "ARMY_4" 
     or armyName == "ARMY_5" 
     or armyName == "ARMY_6" 
     or armyName == "ARMY_7" 
     or armyName == "ARMY_8" 
end 

これも動作します:彼らはこのPHPコードに比べて、両方かなり愚かです

local function isPlayerArmyName(armyName) 
    local names = { 
     ["ARMY_1"] = true, ["ARMY_2"] = true, ["ARMY_3"] = true, ["ARMY_4"] = true, 
     ["ARMY_5"] = true, ["ARMY_6"] = true, ["ARMY_7"] = true, ["ARMY_8"] = true, 
    } 

    return names[armyName] or false 
end 

return in_array($armyName, [ "ARMY_1", "ARMY_2", "ARMY_3", ..., "ARMY_8" ]) 

は作るために良い方法はあります提供されたLuaコードスニペットよりもそのようなチェック?そうでない場合、典型的なLuaプログラマは何を求めているのでしょうか?最初のものか2番目のものか?

私はLua 5.0を使用しています。

+0

2番目の方法でクロージャを使用します。 – hjpotter92

+0

私はあなたの提案を理解していません –

答えて

4

あなたにもこれを行うことができます:あなたはあなたの実装を変更する必要がある場合には、新たな軍隊を追加することができますので、

local names = {"ARMY_1", "ARMY_2", "ARMY_3", "ARMY_4", "ARMY_5", "ARMY_6", "ARMY_7", "ARMY_8"} 

local function isPlayerArmyName(armyName) 
    for index = 1, #names do 
     if names[index] == armyName then 
      return true 
     end 
    end 
end 

このオプションは、スケーラブルです。あなたの目のオプションは、キーを使用しているため、この実装は、あなたの目のオプションよりも少し遅いかもしれません

local function in_array(value, array) 
    for index = 1, #array do 
     if array[index] == value then 
      return true 
     end 
    end 

    return false -- We could ommit this part, as nil is like false 
end 

local armyNames = {"ARMY_1", "ARMY_2", "ARMY_3", "ARMY_4", "ARMY_5", "ARMY_6", "ARMY_7", "ARMY_8"} 

local function isPlayerArmyName(armyName) 
    return in_array(armyName, armyNames) 
end 

:あなたはすべてのあなたのコード内で使用することができ、独自のin_array関数にfor一部を抽出することもできます。あなたの第二の選択肢は悪くない、それは最も速いかもしれない。それは馬鹿に見えますが、簡単に設定可能です。

あなたは、テーブルが不要な場合にも、パターンマッチを使用することができ、その軍の命名規則に固執します:それは文字列を返しますので、

local function isPlayerArmyName(armyName) 
    return (string.match(armyName, "^ARMY_[1-8]$")) ~= nil 
end 

は、あなたも、~= nilを削除することができ、ありますまた、Luaので真:あなたが提供する最初の例として、

local function isPlayerArmyName(armyName) 
    return string.match(armyName, "^ARMY_[1-8]$") 
end 

if isPlayerArmyName("ARMY_1") then 
    -- This will be executed, since it returned "ARMY_1", which evaluates to true 
end 

if isPlayerArmyName("ARMY_9") then 
    -- This will not be executed, since the function returned nil. 
end 

、私はしませんLuaのではなく、他の言語では、それはモジュラーまたはスケーラブルではありませんようことをやってお勧めしません。

+0

私はあなたがあなたがその関数を呼び出すたびに新しいテーブルを作るので、あなたのソリューションが気に入らない。 – warspyking

+0

本当ですか?これは単なるコード例です。私はなぜテーブルを作成するのか分かりません(最終的にはGCになるでしょう)。とにかく、あなたのソリューションは、私がいつもそう呼んでいたら、テーブルを作成します。 –

+0

コードは非常に異なります。私はテーブルをカスタマイズすることができます。なぜなら、あなたの値段を上げることはできません。 (私は効率が非常に高く、非常にニッチなので、あなたが望むなら私を無視してください。) – warspyking

0
function in_array(v, t) 
    for i=1,#t do 
    if v == t[i] then return true end 
    end 
end 

if in_array(v, {....}) then .... end 
+1

彼の2番目のコードはあなたよりも優れています – Vyacheslav

+0

@Vyacheslavここでは、これはPHPの 'in_array'に相当するものを実装する方法であり、さまざまなデータ構造。私は、コードだけの回答は素晴らしいことではないと言うでしょう。 – Oka

2
function in_dictionary(val,dict) 
    return dict[val] 
end 

print(in_dictionary("potatoes", {apples = true, potatoes = true, oranges = true})) 

おそらく最も良い方法です。

関連する問題