Die Programmiersprache Ruby (German Edition)
Puffer schreiben
Die Klasse
StringIO
ist keine Subklasse von
IO
, aber sie definiert viele der gleichen Methoden wie
IO
und durch Duck-Typing können wir im Allgemeinen ein
StringIO
-Objekt statt eines
IO
-Objekts nutzen.
9.7.1.4 Vordefinierte Streams
Ruby definiert eine Reihe von Streams vor, die genutzt werden können, ohne sie erzeugen oder öffnen zu müssen. Die globalen Konstanten
STDIN
,
STDOUT
und
STDERR
sind der Standardeingabestream, der Standardausgabestream und der Standardfehlerstream. Normalerweise sind diese Streams mit der Konsole oder einem Terminalfenster des Benutzers verbunden. Je nachdem, wie Ihr Ruby-Skript aufgerufen wird, kann es sich stattdessen als Eingabequelle oder Ausgabeziel um eine Datei oder sogar einen anderen Prozess handeln. Jedes Ruby-Programm kann von der Standardeingabe lesen und auf die Standardausgabe (für die normale Programmausgabe) oder die Fehlerausgabe schreiben (für Fehlermeldungen, die angezeigt werden sollten, selbst wenn die Standardausgabe in eine Datei umgeleitet wird). Die globalen Variablen
$stdin
,
$stdout
und
$stderr
werden initial auf die gleichen Werte gesetzt wie die Stream-Konstanten. Globale Funktionen wie
print
und
puts
schreiben standardmäßig nach
$stdout
. Wenn ein Skript den Wert dieser globalen Variable ändert, wird das Verhalten dieser Methoden angepasst. Die echte »Standardausgabe« ist trotzdem immer noch über
STDOUT
verfügbar.
Ein anderer vordefinierter Stream ist
ARGF
oder
$<
. Dieser Stream hat ein besonderes Verhalten, da er es besonders leicht machen soll, Skripten zu schreiben, die an der Befehlszeile angegebene Dateien oder von der Standardeingabe zu lesen. Wenn es Kommandozeilenargumente für das Ruby-Skript gibt (im Array
ARGV
oder
$*
), verhält sich der Stream
ARGF
so, als ob diese Dateien verkettet und eine Ergebnisdatei zum Lesen geöffnet wurden. Damit das korrekt funktioniert, muss ein Ruby-Skript, das neben Dateinamen noch andere Befehlszeilenoptionen erwartet, diese zuerst verarbeiten und aus dem Array
ARGV
entfernen. Wenn
ARGV
leer ist, ist
ARGF
das Gleiche wie
STDIN
. (Siehe „10.3.1 Eingabefunktionen“ für weitere Details über den Stream
ARGF
.)
Schließlich ist der Stream
DATA
dazu gedacht, Text zu lesen, der am Ende Ihres Ruby-Skripts steht. Das funktioniert nur, wenn Ihr Skript das Token
__END__
allein in einer Zeile enthält. Dieses Token markiert das Ende des Programmtexts. Jede folgende Zeile kann vom Stream
DATA
eingelesen werden.
9.7.2 Streams und Kodierungen
Eine der wichtigsten Änderungen in Ruby 1.9 ist die Unterstützung für Multibyte-Zeichenkodierungen. Wir haben in „3.2 Text“ gesehen, dass es viele Änderungen an der String-Klasse gab. In der Klasse
IO
gibt es ähnliche Veränderungen.
In Ruby 1.9 können jedem Stream zwei Kodierungen zugewiesen werden. Diese werden als externe und interne Kodierung bezeichnet und von den Methoden
external_encoding
und
internal_encoding
eines
IO
-Objekts ausgelesen. Die externe Kodierung ist die Kodierung des Texts, wie er in der Datei gespeichert wird. Die interne Kodierung ist die Kodierung, die zum Darstellen des Texts innerhalb von Ruby genutzt wird. Wenn die externe Kodierung auch die gewünschte interne Kodierung ist, muss keine interne Kodierung angegeben werden: Strings, die aus dem Stream gelesen werden, ist die externe Kodierung zugewiesen (wie durch die
String
-Methode
force_encoding
). Wenn Sie andererseits möchten, dass die interne Repräsentation des Texts sich von der externen Repräsentation unterscheidet, können Sie eine interne Kodierung angeben, und Ruby wird beim Lesen aus der externen in die interne Kodierung umkodieren und beim Schreiben in die externe Kodierung umwandeln.
Sie geben die Kodierung jedes
IO
-Objekts (einschließlich Pipes und Netzwerk-Sockets) mit der Methode
set_encoding
an. Mit zwei Argumenten legt es eine externe und eine interne Kodierung fest. Sie können auch zwei Kodierungen mit einem einzelnen String-Argument festlegen, wenn der String die beiden Kodierungen durch einen Doppelpunkt getrennt enthält. Normalerweise legt ein einzelnes Argument allerdings nur eine externe Kodierung fest. Die Argumente können Strings oder
Encoding
-Objekte sein. Die externe Kodierung wird immer als erste festgelegt, optional gefolgt von einer internen Kodierung, zum Beispiel:
f.set_encoding("iso-8859-1", "utf-8") # Latin-1, umkodiert nach UTF-8
f.set_encoding("iso-8859-1:utf-8") # wie oben
f.set_encoding(Encoding::UTF-8) # UTF-8
Weitere Kostenlose Bücher