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 endOder man kann die Standardausgabe auch ganz ohne Puffer betreiben, indem man
STDOUT.sync = true
setzt.
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"