2012-10-06 15 views
12

¿Cómo terminaría un script de Lua? En este momento estoy teniendo problemas con exit(), y no sé por qué. (. Esto es más una cuestión de Minecraft ComputerCraft, ya que utiliza las API incluidas) Aquí está mi código:¿Cómo terminar la secuencia de comandos de Lua?

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 

Respuesta

17

Como dice la respuesta de prapin, en Lua la función os.exit([code]) terminará la ejecución del programa host. Esto, sin embargo, puede no ser lo que está buscando, ya que al llamar al os.exit finalizará no solo el script, sino también las instancias Lua padre que se están ejecutando.

En Minecraft ComputerCraft, llamando error() también que hará lo que usted está buscando, pero usarlo para otros fines que los que termina realmente el guión después de haberse producido un error probablemente no es una buena práctica.

Porque en Lua todos los archivos de script también se consideran funciones que tienen su propio ámbito, la forma preferida de salir de su script sería usar la palabra clave return, tal como lo hace desde las funciones.

De esta manera:

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 
+0

¡Ah, gracias! Ayudó mucho – user1610406

+0

error() debería funcionar bien en este caso, pero también agregué la solución que es de mejor práctica. – user1704650

+1

Gracias, aunque esto no funcionará desde dentro de una llamada de función en el programa Lua. (Estoy teniendo el mismo problema.) –

3

No hay una función global llamada exit en la norma Lua.

Sin embargo, existe una función os.exit. En Lua 5.1, tiene un argumento opcional, el código de error. En Lua 5.2, hay un segundo parámetro opcional, que indica si el estado de Lua debe cerrarse antes de salir.

Pero tenga en cuenta que Minecraft ComputerCraft puede proporcionar una función diferente a la estándar os.exit uno.

+0

La función 'os.exit()' no sale de los programas en ComputerCraft. Obtendrá un error si intenta ejecutarlo. En su lugar, use 'shell.exit()' http://computercraft.info/wiki/Shell.exit –

1

También puede interrumpir manualmente manteniendo pulsada la tecla Ctrl + T unos segundos en la interfaz de la tortuga/del ordenador.

4

La declaración break saltará a la línea después de la for, while o repeat bucle está en

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 

un capricho de lua:. break tiene que venir justo antes de un end, aunque no necesariamente la end del bucle del que desea salir, como puede ver aquí.

Además, si desea salir del bucle en una condición al inicio o al final del bucle, como se indicó anteriormente, a menudo puede cambiar el bucle que está utilizando para obtener un efecto similar. Por ejemplo, en este ejemplo podríamos poner la condición en el bucle while:

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

Tenga en cuenta que sutilmente he cambiado el comportamiento un poco allí, ya que este nuevo bucle se detendrá de inmediato cuando golpea el límite recuento de elementos, sin continuar hasta que detect() vuelva a ser cierto.

0

no utilice un while true

hacer algo como esto:

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 

También usted no tiene que llamar antes de excavar turtle.detect() porque turtle.dig() Wil lo llaman de nuevo interna

0

No utilice while true. En lugar de usar algo como esto:

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

Funcionará para usted.

Cuestiones relacionadas