2016-07-13 13 views
2

ich einige Berechnungen zu tun, wie die Testfälle für eine Frage verwende ich auf PCCG Stapel von Exchange schreiben werde, und ich bemerkte, in einem Stück Code wie folgt, dass:Warum wird das zweite Instrument vor dem ersten evaluiert?

for i = 0, 20 do 
    io.write(i..": ") 
    diff(i) 
end 

(wo diff a Funktion, die eine ziemlich schwere Berechnung durchführt und das Ergebnis ausgibt), das Ergebnis von diff wird zuerst berechnet und dann werden i: und das Ergebnis diff gedruckt.

Aber warum passiert das? Sollte ich nicht i: vor und während der Berechnung sehen, und das Ergebnis der Berechnung erst nach? Warum wartet es auf die Ausführung von diff vor?

Das habe ich zuerst mit Luajit bemerkt, aber es passiert auch auf Vanille Lua und sogar außerhalb einer for Schleife.

+3

Dies passiert in der Regel, weil die Ausgabe gepuffert ist, in Java würden Sie einen Unterschied sehen, wenn Sie in den Fehler-Stream schreiben würden, aber ich weiß nicht, wie es in lua ist. – maraca

Antwort

5

Wie bei vielen anderen Ausgabefunktionen in vielen anderen Sprachen ist der Ausgang io.write gepuffert. Es wird ausgewertet, es ist nur Ihre Ausgabe ist jetzt im Zwischenspeicher noch anstehende Spülung oder Füllung dieses Puffers. Fügen Sie einen Anruf io.flush() hinzu, wenn Sie Ihre Daten sofort durchgehen müssen.

+0

Spült 'Print' die Ausgabe automatisch? Ich muss die Nummer nicht anzeigen, ich war nur neugierig auf das. – user6245072

+3

@ user6245072 - Zeilen, die nicht mit LF terminiert sind, werden gepuffert. 'print' hängt LF immer an das Ende von string, so dass die Ausgabe sofort erfolgt. –