next up previous contents index
Search Next: Ausnahme- und Fehlerbehandlung Up: Variablen, Blöcke und Iteratoren Previous: Fehlerbehandlung bei   Contents   Index

Tastatur und Standardausgabe

Ruby hat keine eingebaute Möglichkeit, Tastendrücke direkt abzufangen und zu bearbeiten. Diese Einschränkung liegt daran, dass in den verschiedenen Betriebssystemen, auf denen Ruby läuft, dies auf sehr unterschiedliche Arten durchgeführt werden muss und manchmal ohne externe Unterstützung auch gar nicht möglich ist.

Auf Unix-Systemen (und auch in der Cygwin-Umgebung unter Windows) wird die Tastatureingabe normalerweise zeilenweise gepuffert. Ein Programm bekommt die Daten damit erst zu sehen, wenn der Benutzer die Return-Taste betätigt hat. Damit die Tastendrücke sofort an Ruby übermittelt werden, müssen mit dem stty-Befehl die Einstellungen der Terminalemulation entsprechend modifiziert werden.

system("stty raw -echo")
begin
  c = STDIN.getc
ensure 
  system("stty sane")
end

Um in einer "`reinen"' Windows-Applikation sofort auf einen Tastendruck zu reagieren, kann man Folgendes ausführen:

require 'Win32API'
getch = Win32API.new("crtdll", "_getch", [], 'L')
puts getch.Call.chr

Normalerweise[*] wird die Standardausgabe zeilenweise gepuffert, also erst dann geschrieben, wenn ein Zeilenwechsel ausgegeben wird. Möchte man den Text sofort sehen, kann man die print-Methode umdefinieren:

def print(*a)
  super(*a)
  $stdout.flush
end
Oder man kann die Standardausgabe auch ganz ohne Puffer betreiben, indem man STDOUT.sync = true setzt.


\epsfig{height=36pt,file=images/chan.eps}Man kann die Ausgabe der Ruby-Methodenfamilie um print und put von der Standardausgabe weg auf ein Objekt umleiten, das die Methode write implementiert. Das folgende Beispiel sollte man nicht mit der interaktiven Ruby-Shell irb ausprobieren, da dort zusätzliche Ausgaben erzeugt werden, die das Ergebnis verändern.

buffer = ">>>"
def buffer.write(str)
  self << str
end

# Ausgabe umlenken
$defout = buffer    #-> ">>>"
puts "hallo"        #-> "hallo\n"

# Ausgabe zurücksetzen
$defout = STDOUT
p buffer            #-> ">>>hallo\n"
\epsfig{height=10pt,file=images/ruby.eps}



Footnotes

...Normalerweise[*]
Autoflush

next up previous contents index
Search Next: Ausnahme- und Fehlerbehandlung Up: Variablen, Blöcke und Iteratoren Previous: =0pt plus180pt Fehlerbehandlung bei   Contents   Index
(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20