Подтвердить что ты не робот

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

Ответ 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

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