web-dev-qa-db-ja.com

Luaスクリプトを終了する方法は?

Luaスクリプトを終了するにはどうすればよいですか?現在、exit()で問題が発生していますが、その理由はわかりません。 (これは、含まれているAPIを使用するため、Minecraft ComputerCraftの質問になります。)私のコードは次のとおりです。

while true do

    if turtle.detect() then

        if turtle.getItemCount(16) == 64 then

            exit() --here is where I get problems

        end

        turtle.Dig() --digs block in front of it

    end

end
13
user1610406

Prapinの答えが述べているように、Luaでは関数os.exit([code])がホストプログラムの実行を終了します。ただし、_os.exit_を呼び出すと、スクリプトだけでなく、実行中の親Luaインスタンスも終了するため、これは探しているものではない可能性があります。

Minecraft ComputerCraftでは、error()を呼び出すことでも目的を達成できますが、エラーが発生した後にスクリプトを完全に終了する以外の目的で使用することはおそらく適切ではありません。練習。

Luaでは、すべてのスクリプトファイルも独自のスコープを持つ関数と見なされるため、スクリプトを終了するための推奨される方法は、関数から戻るのと同じように、returnキーワードを使用することです。

このような:

_while true do

    if turtle.detect() then

        if turtle.getItemCount(16) == 64 then

            return -- exit from the script and return to the caller

        end

        turtle.Dig() --digs block in front of it

    end

end
_
17
user1704650

breakステートメントは、forwhile、またはrepeatループの後の行にスキップします。

_while true do
    if turtle.detect() then
        if turtle.getItemCount(16) == 64 then
            break
        end
        turtle.Dig() -- digs block in front of it
    end
end
-- break skips to here
_

Luaの癖:breakendの直前に来る必要がありますが、ここに示すように、必ずしもループから抜け出したいループのendである必要はありません。

また、上記のように、ループの開始時または終了時の条件でループを終了する場合は、使用しているループを変更して同様の効果を得ることができます。たとえば、この例では、条件をwhileループに入れることができます。

_while turtle.getItemCount(16) < 64 do
  if turtle.detect() then
    turtle.Dig()
  end
end
_

この新しいループは、detect()が再びtrueになるまで続行せずに、アイテム数の制限に達するとすぐに停止するため、動作を少し変更したことに注意してください。

4
rakslice

標準のLuaにはexitという名前のグローバル関数はありません。

ただし、os.exit関数があります。 Lua 5.1では、オプションの引数が1つ、エラーコードがあります。 Lua 5.2には、終了する前にLua状態を閉じる必要があるかどうかを示す2番目のオプションのパラメーターがあります。

ただし、Minecraft ComputerCraftは、標準のos.exitとは異なる機能を提供する場合があることに注意してください。

3
prapin

押し続けることで手動で終了することもできます Ctrl + T タートル/コンピューターのインターフェースで数秒。

2
1vannn

_while true_を使用しないでください

このようなことをします:

_running = true
while running do

    -- Dig block
        turtle.Dig() --digs block in front of it

    -- check your condition and set "running" to false
    if turtle.getItemCount(16) == 64 then
        running = false
    end

end
_

また、掘る前にturtle.detect()を呼び出す必要はありません。これは、turtle.Dig()が内部で再度呼び出すためです。

1
Mischa

Shell.exit()は、コンピュータークラフトのluaスクリプトを閉じます。詳細については、 http://computercraft.info/wiki/Shell.exit にアクセスしてください。

0
Knolax

while trueは使用しないでください。代わりに、次のようなものを使用します。

while turtle.getItemCount(16) < 64 do
  if turtle.detect() then
    turtle.Dig()
  end
end

それはあなたのために働くでしょう。

0
user6537920