如何终止Lua脚本?

我该如何终止Lua脚本?目前我遇到了exit()的问题,但我不知道为什么。(这更像是一个Minecraft ComputerCraft问题,因为它使用了包含的API。)下面是我的代码:

while true do

    if turtle.detect() then

        if turtle.getItemCount(16) == 64 then

            exit() --这里是我遇到问题的地方

        end

        turtle.dig() -- 挖掘它前面的方块

    end

end
点赞
用户1008957
用户1008957

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

但是,在 Lua 5.1 中,有一个名为 os.exit 的函数,它有一个可选参数,表示错误代码。在 Lua 5.2 中,这个函数有第二个可选参数,表示是否在退出之前关闭 Lua 状态。

但需要注意的是,《Minecraft ComputerCraft》可能提供的 os.exit 函数与标准函数不同。

2012-10-06 14:19:06
用户1704650
用户1704650

如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 --退出脚本并返回给调用者

        end

        turtle.dig() --挖出它前面的方块

    end

end
2012-10-06 14:38:45
用户2288452
用户2288452

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

2013-04-23 02:40:51
用户60422
用户60422

break语句将跳过当前所在的forwhile或者repeat循环后执行下一行。

while true do
    if turtle.detect() then
        if turtle.getItemCount(16) == 64 then
            break
        end
        turtle.dig() -- 挖掘面前的方块
    end
end
-- break 跳到这里执行

一个Lua的特性:break语句必须放在一个end之前,但不一定是你想要跳出的循环的end,就像在这个例子中看到的。

此外,如果你想要在循环的开始或结束时根据某个条件跳出循环(就像上面的例子),有时你可以更改使用的循环以获得相似的效果。例如,在这个例子中,我们将条件放在了while循环中:

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

请注意,我稍微改变了行为,因为这个新的循环会在达到道具计数限制时立即停止,而不会一直循环直到detect()再次为真。

2013-10-16 06:59:42
用户3517492
用户3517492

shell.exit() 用于关闭在 Computer Craft (计算机模组)中运行的 Lua 脚本。

要了解更多信息,请访问http://computercraft.info/wiki/Shell.exit

2014-04-10 00:09:09
用户4273199
用户4273199

不要使用 while true,可以像这样做:

running = true
while running do

    -- 挖方块
    turtle.dig() -- 在它前面挖掉方块

    -- 检查条件并将 "running" 设置为 false
    if turtle.getItemCount(16) == 64 then
        running = false
    end

end

此外,你不用在挖之前调用 turtle.detect(),因为 turtle.dig() 会再次内部调用它。

2016-02-10 14:44:09
用户88888888
用户88888888

不要使用 while true,而是使用这样的东西:

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

这将适用于你。

2016-11-19 08:35:33