Как завершить Lua script?
Как мне закончить Lua script? Сейчас у меня проблемы с 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
Ответы
Ответ 1
Как говорится в ответе prapin, в Lua функция os.exit([code])
завершит выполнение хост-программы. Это, однако, может быть не то, что вы ищете, потому что вызов os.exit
приведет к завершению не только вашего script, но и родительских экземпляров Lua, которые запущены.
В программе Minecraft ComputerCraft вызов error()
также выполнит то, что вы ищете, но использование его для других целей, чем истинное завершение script после возникновения ошибки, вероятно, не является хорошей практикой.
Так как в Lua все файлы script также считаются функциями, имеющими свою область видимости, предпочтительным способом выхода из script будет использование ключевого слова 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
Ответ 2
Оператор 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()
не вернется снова.
Ответ 3
В стандартном Lua нет глобальной функции с именем exit
.
Однако существует функция os.exit
. В Lua 5.1 у него есть один необязательный аргумент - код ошибки. На Lua 5.2 есть второй необязательный параметр, указывающий, должно ли состояние Lua закрываться до выхода.
Но обратите внимание, что Minecraft ComputerCraft может предоставлять другую функцию, чем стандартная os.exit
.
Ответ 4
Вы также можете завершить его вручную, удерживая Ctrl + T несколько секунд в интерфейсе черепахи/компьютера.
Ответ 5
shell.exit() закрывает lua script в компьютерном магазине.
для получения дополнительной информации перейдите к http://computercraft.info/wiki/Shell.exit
Ответ 6
не использовать 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 снова вызвать его внутреннюю
Ответ 7
Не используйте while true
. Вместо этого используйте что-то вроде этого:
while turtle.getItemCount(16) < 64 do
if turtle.detect() then
turtle.dig()
end
end
Он будет работать для вас.