Как завершить сценарий Lua?

Как бы я прекратил сценарий Lua? Прямо сейчас у меня проблемы с exit(), и я не знаю, почему. (Это больше вопрос Minecraft ComputerCraft, так как он использует включенные API.) Вот мой код:

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

7 ответов


как говорится в ответе прапина, в 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

на break оператор пропустит строку после for, while или 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

причуда Луа: break должен прийти непосредственно перед end, хотя и не обязательно end петли, из которой вы хотите вырваться, как вы можете видеть здесь.

кроме того, если вы хотите выйти из цикла при условии в начале или конце цикла, как указано выше, часто вы можете изменить цикл, который вы используете, чтобы получить аналогичный эффект. Например, в в этом примере мы могли бы поставить условие while петли:

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

обратите внимание, что я тонко изменил поведение немного там, так как этот новый цикл остановится сразу, когда он достигнет предела количества элементов, не продолжая до detect() снова становится правдой.


нет глобальной функции с именем exit в стандартном Lua.

, есть

вы также можете прекратить его вручную, удерживая Ctrl + T несколько секунд в интерфейсе черепаха/компьютера.


shell.exit () закрывает сценарий lua в компьютере. для получения дополнительной информации перейдите вhttp://computercraft.info/wiki/Shell.exit


не использовать 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() wil назовем его снова внутренним


Не используйте while true. Вместо этого используйте что-то вроде этого:

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

Она будет работать для вас.