Как завершить 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
Причуда 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()
назовем это снова внутренним