4

Lua は軽量で強力な言語ですが、他の言語で慣れ親しんだ非常に便利な機能が欠けているように感じることがあります。私の質問は、ネストされたif条件についてです。Perl、Python、C++ では、一般的に入れ子構造を避け、可能な限り単純なコードを書く傾向があります。

# Perl:
for (my $i = 0; $i < 10; ++$i) {
    next unless some_condition_1();
    next unless some_condition_2();
    next unless some_condition_3();
    ....
    the_core_logic_goes_here();        
}

Lua にはnextorcontinueステートメントがないため、同じコードは次のようになります。

-- Lua:
for i = 1, 5 do
    if some_condition_1() then
        if some_condition_2() then
            if some_condition_3() then
                the_core_logic_goes_here()
            end
        end
    end
end

ifLuaでネストされたブロックを回避するための標準的なアプローチがあるかどうか疑問に思っていますか?

4

5 に答える 5

6

Lua 5.2 では、 gotoステートメントを使用できます(注意してください)。

そのキーワードの一般的な使用法の 1 つは、不足しているcontinueornextステートメントを置き換えることです。

for i = 1, 5 do
  if not some_condition_1() then goto continue end
  if not some_condition_2() then goto continue end
  if not some_condition_3() then goto continue end
  the_core_logic_goes_here()
::continue::
end
于 2012-09-12T11:22:27.687 に答える
5

これが特に慣用的かどうかはわかりませんが、単一のネストされたループを使用しbreakてシミュレートできますcontinue

for i = 1, 5 do
    repeat
        if some_condition_1() then break end
        if some_condition_2() then break end
        if some_condition_3() then break end
        the_core_logic_goes_here()
    until true
end
于 2012-09-12T10:49:28.003 に答える
4

他の言語で慣れ親しんだ非常に便利な機能が欠けているように感じることがあります

トレードオフは、概念の経済性です。これにより、実装が単純になり、Lua の有名な速度とサイズが小さくなります。

あなたのコードに関しては、これは最も広範な解決策ではありません (実装の 2 つの方法については、他の回答者を参照してください)。ただし、特定のコードについては、次のように記述します。

for i = 1, 5 do
    if  some_condition_1() 
    and some_condition_2() 
    and some_condition_3() then
        the_core_logic_goes_here()
    end
end
于 2012-09-12T16:00:05.947 に答える
0

解決策 1.

すべての条件を if ステートメントに追加し、else ステートメントを使用するだけで済みます。だから、このようなもの:

if cond_1() and cond_2() and cond_n() then
  the_core_logic_goes_here()
else
  -- do something else here
end

解決策 2。

同様のものを使用できますが、より快適な他の言語のように見えるものを使用できます。これは、満たされないif cond_n() then else return end場合に nil を返すだけです。cond_n()全体として、次のようになります。

for idx=1, 5 do
  if cond_1() then else return end
  if cond_2() then else return end
  if cond_3() then else return end
  if cond_4() then else return end
  the_core_logic_goes_here()
end

ただし、前者を使用する必要があると本当に思います。これははるかに優れたソリューションであり、lua ソリューション 1. はより高速なバイトコードにコンパイルされると確信しています。

于 2016-08-06T22:47:05.577 に答える
0
for v in pairs{condition1,condition2,condition3} do
    if  v() then
        the_core_logic_goes_here()
    end
end

あなたの好みかもしれませんか?

「Lua には next または continue ステートメントがありません」 次のステートメントとしての Lua と非常によく似た関数「ipairs」。

于 2012-09-12T23:59:09.747 に答える