2012-10-06 12 views
12

Come terminare uno script Lua? In questo momento sto avendo problemi con exit(), e non so perché. (. Questo è più di una domanda Minecraft ComputerCraft, dal momento che utilizza le API incluse) Ecco il mio codice:Come terminare lo script 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 

risposta

17

Come indica la risposta di Prapin, in Lua la funzione os.exit([code]) termina l'esecuzione del programma host. Questo, tuttavia, potrebbe non essere quello che stai cercando, perché chiamando os.exit terminerà non solo il tuo script, ma anche le istanze Lua genitore che sono in esecuzione.

In Minecraft ComputerCraft, chiamando error() anche realizzare quello che stai cercando, ma il suo utilizzo per scopi diversi da quelli realmente terminare lo script dopo si è verificato un errore non è probabilmente una buona pratica.

Poiché in Lua tutti i file di script sono anche considerati funzioni con un proprio ambito, il modo migliore per uscire dallo script è utilizzare la parola chiave return, proprio come si torna dalle funzioni.

Ti piace questa:

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, grazie! Ha aiutato molto l'errore – user1610406

+0

() dovrebbe funzionare bene in questo caso, ma ho anche aggiunto la soluzione che è di migliore pratica. – user1704650

+1

Grazie, anche se questo non funzionerà da una chiamata di funzione nel programma Lua. (Sto avendo lo stesso problema.) –

3

Non esiste una funzione globale chiamata exit nella norma Lua.

Tuttavia, esiste una funzione os.exit. In Lua 5.1, ha un argomento opzionale, il codice di errore. Su Lua 5.2, c'è un secondo parametro opzionale, che indica se lo stato di Lua deve essere chiuso prima di uscire.

Tuttavia, notare che Minecraft ComputerCraft può fornire una funzione diversa da quella standard os.exit.

+0

La funzione 'os.exit()' non esce dai programmi in ComputerCraft. Si verificherà un errore se si tenta di eseguirlo. Invece, usa 'shell.exit()' http://computercraft.info/wiki/Shell.exit –

1

Si può anche terminare manualmente tenendo premuto Ctrl + T pochi secondi nell'interfaccia tartaruga/del computer.

4

La dichiarazione break salterà la linea dopo la for, while, o repeat ciclo è in

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 cavillo di Lua:. break deve venire prima di un end, anche se non necessariamente la end del ciclo da cui vuoi uscire, come puoi vedere qui.

Inoltre, se si desidera uscire dal ciclo su una condizione all'inizio o alla fine del ciclo, come sopra, spesso è possibile modificare il ciclo che si sta utilizzando per ottenere un effetto simile. Per esempio, in questo esempio potremmo mettere la condizione nel ciclo while:

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

Nota che sottilmente cambiato il comportamento un po 'là, come questo nuovo ciclo si fermerà subito quando si colpisce il limite di conteggio oggetto, senza continuare fino al detect() diventa di nuovo true.

0

non utilizzare un while true

fare qualcosa di simile:

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 

Inoltre è non c'è bisogno di chiamare turtle.detect() prima di scavare perche' turtle.dig() wil lo chiamano di nuovo interno

0

Non utilizzare while true. Invece di utilizzare qualcosa di simile:

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

Funzionerà per voi.

Problemi correlati