Wie lua sequentiell ausgeführt wird

8

Ich lerne Lua über diese Seite . Ich bin am Anfang der Tutorials und versuche dieses Programm (geben Sie eine Zahl ein, x , es gibt x! zurück):

%Vor%

Wenn ich es jedoch ausführe, scheint io.read vor der Aufforderung zu stehen. Ich führe es in Notepad ++ Konsole so:

%Vor%

Die Ausgabe ist (scheinbar) leer, aber wenn ich eine Zahl eingabe, läuft die Funktion.

%Vor%

Obwohl dies hier kein großes Problem darstellt, kann ich mir nur die Probleme vorstellen, die sich daraus ergeben, dass Variablen vor der Erstellung verwendet werden. Also, wie kann ich dieses Programm dazu bringen, nach einer Nummer zu fragen, bevor ich eine Eingabe lese?

    
David Starkey 14.10.2013, 19:05
quelle

1 Antwort

13

Was passiert, ist nicht, dass der Code nicht in der richtigen Reihenfolge läuft, sondern dass die Eingabeaufforderung nicht sofort auf dem Terminal angezeigt wird.

Intern wird alles, was Sie ausgeben, vom Betriebssystem in einem IO-Puffer gespeichert. Der Puffer wird regelmäßig geleert und sein Inhalt wird auf dem Terminal angezeigt (es wird gelöscht ). Auf den meisten Systemen ist das Terminal standardmäßig -Zeile gepuffert , was bedeutet, dass jedes Mal, wenn Sie ein Zeilenendezeichen schreiben - was print() automatisch tut - es gelöscht wird; Bei einigen Systemen ist es jedoch standardmäßig vollständig gepuffert , was bedeutet, dass es nur dann automatisch geleert wird, wenn es voll ist.

Es gibt zwei Möglichkeiten, wie Sie das angehen können. Wenn Sie die Pufferung für alle IO-Operationen in einer Datei deaktivieren oder ändern möchten (und zu diesem Zweck zählt das Terminal als Datei), können Sie das file:setvbuf() Funktion; Insbesondere deaktiviert io.output():setvbuf("no") die Pufferung für die Standardausgabe, was bedeutet, dass alles, was Sie schreiben, sofort angezeigt wird. Sie können auch io.output():setvbuf("line") verwenden, um die Zeilenpufferung zu aktivieren, auf Systemen, auf denen dies unterstützt wird, aber nicht standardmäßig.

Die andere Möglichkeit besteht darin, den Puffer manuell zu leeren, was nützlich ist, wenn Sie möchten, dass eine bestimmte Ausgabe sofort angezeigt wird, aber nicht allgemein die Pufferung der Ausgabe deaktivieren soll. Sie können dies mit der Funktion file:flush() tun, die den Puffer sofort löscht zum Beispiel:

%Vor%

Beachten Sie, dass io.write() und io.flush() sind nur Komfortfunktionen für io.output():write() und io.output():flush() , dh sie erhalten die aktuelle Ausgabedatei und dann :write() oder :flush() für sie aufrufen.

(Warum sollte man überhaupt mit Puffer arbeiten? Weil es schneller ist - Daten auf ein Terminal oder eine Datei zu schreiben ist teuer, und das Schreiben einer großen Sache ist schneller als das Schreiben vieler kleiner Dinge. In den meisten Fällen spielt es keine Rolle Dinge werden nicht sofort geschrieben, wenn der Code ausgeführt wird, also speichert das Betriebssystem die zu schreibenden Daten in einem Puffer und macht dann einen einzelnen großen Schreibvorgang, wenn der Puffer voll ist.)

    
ToxicFrog 14.10.2013, 20:37
quelle

Tags und Links