如何终止Lua脚本?

时间:2012-10-06 14:03:45

标签: lua minecraft computercraft

如何终止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 个答案:

答案 0 :(得分:17)

正如prapin的回答所述,在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

答案 1 :(得分:4)

break语句会在forwhilerepeat循环后跳到该行。

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()再次成为真。

答案 2 :(得分:3)

标准Lua中没有名为exit的全局函数。

但是,有一个os.exit功能。在Lua 5.1中,它有一个可选参数,即错误代码。在Lua 5.2上,有第二个可选参数,告诉Lua状态是否应该在退出之前关闭。

但请注意, Minecraft ComputerCraft 可能提供与标准os.exit不同的功能。

答案 3 :(得分:2)

您也可以通过在海龟/计算机界面中按住 Ctrl + T 几秒钟手动终止它。

答案 4 :(得分:0)

shell.exit()关闭计算机工艺中的lua脚本。 有关详细信息,请转至http://computercraft.info/wiki/Shell.exit

答案 5 :(得分:0)

不要使用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()会再次调用内部

答案 6 :(得分:0)

请勿使用while true。而不是使用这样的东西:

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

它适用于你。