Как завершить 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 12
lua

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

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

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

while turtle.getItemCount(16) < 64 do
  if turtle.detect() then
    turtle.dig()
  end
end
Обратите внимание, что я слегка изменил поведение там, так как этот новый цикл остановится сразу же, когда он достигнет предела количества элементов, не продолжая до тех пор, пока detect() снова не станет истинным.

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

Однако существует функция os.exit. В Lua 5.1 он имеет один необязательный аргумент-код ошибки. В Lua 5.2 есть второй необязательный параметр, указывающий, должно ли состояние Lua быть закрыто перед выходом. Но обратите внимание, чтоMinecraft ComputerCraft может предоставлять другую функцию, чем стандартная os.exit.

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

Оболочка.exit() закрывает скрипт lua в программе computer craft. для получения дополнительной информации перейдите по ссылке 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() назовем это снова внутренним

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

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

Это будет работать на вас.