Programmierung in Ruby

Der Leitfaden der Pragmatischen Programmierer

Inhalt




Vorwort




Vorwort der deutschen Übersetzung




Einführung

Ruby funkelt
Was für eine Sorte Sprache ist Ruby?
Ist Ruby was für mich?
Warum haben wir dieses Buch geschrieben?
Ruby Versionen
Ruby installieren
Building Ruby
Ruby laufen lassen
Interaktives Ruby
Ruby-Programme
Resourcen
Danksagungen
Notationen



Übersicht




Facetten von Ruby




Ruby.new

Ruby ist eine objekt-orientierte Sprache
Einige Ruby Grundlagen
Arrays und Hashes
Kontroll-Strukturen
Reguläre Ausdrücke
Blöcke und Iteratoren
Lesen und Sreiben
Vorschau und Ausblick



Klassen, Objekte und Variablen

Vererbung und Meldungen
Vererbung und Mixins
Objekte und Attribute
Beschreibbare Attribute
Virtuelle Attribute
Klassen-Variablen und Methoden-Variablen
Klassen-Variablen
Klassen-Methoden
Singletons und andere Konstruktoren
Zugriffs-Kontrolle
Zugriffskontrolle setzen
Variablen



Container, Blöcke und Iteratoren

Container
Arrays
Hashes
Einen SongList-Container implementieren
Blocks and Iterators
Iteratoren implementieren
Ruby verglichen mit C++ und Java
Blöcke für Transaktionen



Standardtypen

Zahlen
Zeichenketten (Strings)
Mit Strings arbeiten
Bereiche (Ranges)
Ranges als Reihen
Bereiche als Bedingungen
Bereiche als Intervalle
Reguläre Ausdrücke
Muster
Anker
Zeichenklassen
Wiederholung
Alternation
Gruppierung
Musterbasierte Ersetzung
Backslashsequenzen in der Ersetzung
Objektorientierte reguläre Ausdrücke



Mehr über Methoden

Methoden definieren
Argumentlisten variabler Länge
Methoden und Blöcke
Methoden aufrufen
Arrays in Methodenaufrufen expandieren
Dynamischere Blöcke
Hash-Argumente sammeln



Ausdrücke

Operatorenausdrücke (Operator Expressions)
Verschiedene Ausdrücke
Befehlsexpansion
Backquotes sind weich
Zuweisung
Parallelzuweisung
Verschachtelte Zuweisungen
Andere Formen von Zuweisung
Bedingte Ausführung
Boolsche Ausdrücke
Defined?, And, Or, und Not
If und Unless
Modifikatoren für If und Unless
Case Ausdrücke
Schleifen
Iteratoren
For ... In
Break, Redo und Next
Retry
Variablenscope und Schleifen



Exceptions, Catch und Throw

Die Exception Klasse
Exceptions behandeln
Aufräumen
Nochmal auf Start
Exceptions auslösen
Informationen zu Exceptions hinzufügen
Catch und Throw



Module

Namensräume
Mixins
Instanzvariablen in Mixins
Iteratoren und das Modul Enumerable
Andere Dateien einfügen



Eingabe und Ausgabe

Was ist ein IO-Objekt?
Dateien öffnen und schließen
Dateien lesen und schreiben
Lese-Iteratoren
In Dateien schreiben
Aber ich vermisse meinen Iostream aus C++!
Mit Netzwerken reden



Threads und Prozesse

Multithreading
Ruby-Threads erzeugen
Threads manipulieren
Thread-Variablen
Threads und Exceptions
Kontrolle des Thread-Schedulers
Gegenseitiger Ausschluss
Die Mutex Klasse
Condition-Variablen
Multiple Prozesse laufen lassen
Produzieren neuer Prozesse
Unabhängige Kinder
Blöcke und Unterprozesse



Wenn's Schwierigkeiten gibt

Der Ruby-Debugger
Interaktives Ruby
Editor Support
Es klappt aber nicht!
Aber es ist zu langsam!
Erzeuge lokale Variablen außerhalb von Blöcken
Benutze den Profiler



Ruby im Kontext




Ruby und seine Welt

Kommandozeilen-Argumente
Kommandozeilen-Optionen
ARGV
Programm-Terminierung
Umgebungs-Variablen
Umgebungsvariablen schreiben
Wo Ruby seine Module findet
Build-Umgebung



Ruby und das Web

CGI-Scripts schreiben
Verwendung von cgi.rb
Quoting
Formulare
Formulare und HTML erzeugen
Cookies
Sessions
Ruby in HTML einbetten
eruby
eruby in Apache installieren
Performance steigern



Ruby Tk

Eine einfache Tk-Applikation
Widgets
Setzen von Widget-Optionen
Daten vom Widget holen
dynamisches Setzen/Abrufen von Optionen
Beispiel-Applikation
Verknüpfung von Events
Canvas
Scrolling
Nur noch eine Sache
Übersetzungen aus der Perl/Tk-Dokumentation
Objekt-Erzeugung
Optionen
Variable-Referenzen



Ruby und Microsoft Windows

Ruby Ports
Ruby unter Windows laufen lassen
Win32API
Windows Automation
Properties setzen und lesen
Benamte Argumente
for each
Ein Beispiel
Optimierung



Ruby erweitern

Ruby Objekte in C
VALUE als Zeiger
VALUE als Immediate-Objekt
Schreiben von Ruby Code in C
Auswertung von Ruby Ausdrücken in C
Direkte Verwendung von Daten in Ruby und C
Gemeinsames Verwenden von Variablen
C Strukturen einpacken
Ein Beispiel
Speicher Allokation
Erzeugen einer Erweiterung
Erzeugen eines Makefiles mit Hilfe von extconf.rb
Dynamisches Binden
Statisches Binden
Einbetten eines Ruby Interpreters
Ruby an andere Sprachen anbinden
Ruby C API



Ruby im Detail




Die Sprache Ruby

Layout der Quellen
BEGIN und END Blöcke
Allgemein begrenzter Input
Die Basis-Typen
Integer und Fließkomma-Zahlen
Strings
Ranges
Arrays
Hashes
Bedingungen für den Hash-Schlüssel
Symbole
Reguläre Ausdrücke
Optionen für Reguläre Ausdrücke
Muster für reguläre Ausdrücke
Ersetzungen
Erweiterungen
Namen
Variablen/Methoden-Mehrdeutigkeit
Variablen und Konstanten
Gültigkeitsbereich von Konstanten und Variablen
Vordefinierte Variablen
Informationen über Exceptions
Variablen zur Muster-Erfassung
Input/Output-Variablen
Variablen der Ausführungs-Umgebung
Standard Objekte
Globale Konstanten
Ausdrücke
Einfache Terme
Operator-Ausdrücke
Mehr über Zuweisungen
Parallele Zuweisung
Block-Ausdrücke
Boolsche Ausdrücke
Wahrheits-Werte
And, Or, Not und Defined?
Vergleichs-Operatoren
Bereiche in Boolschen Ausdrücken
Reguläre Ausdrücke in boolschen Ausdrücken
If und Unless Ausdrücke
If und Unless Modifikatoren
Ternärer Operator
Case-Ausdruck
Schleifen
While- und Until-Modifikatioren
Break, Redo, Next und Retry
Methoden-Definition
Methoden-Argumente
Aufruf einer Methode
super
Operator-Methoden
Attribut-Zuweisung
Element-Referenz-Operator
Aliasing
Klassen-Definition
Objekt-Erzeugung durch Klassen
Deklaration von Klassen-Attributen
Modul-Definitionen
Mixins --- Module einbinden
Modul-Funktionen
Zugriffs-Kontrolle
Blöcke, Closures und Proc-Objekte
Proc-Objekte
Exceptions
Exceptions auslösen
Exception-Behandlung
Block-Wiederholung, Retry
Catch und Throw



Klassen und Objekte

Wie Klassen und Objekte interagieren
Das Basis-Objekt für jeden Tag
Und was ist mit dem Meta?
Objekt-spezifische Klassen
Mixin-Module
Objekte erweitern
Klassen- und Modul-Definitionen
Klassen-Namen sind Konstanten
Die Umgebung der Top-Level-Ausführung
Vererbung und Sichtbarkeit
Objekte einfrieren



Ruby im Tresor sichern

Safe-Levels
Tainted Objekte



Reflektion, Objekt-Raum und Verteiltes Ruby

Betrachtung von Objekten
Betrachtung des Inneren von Objekten
Betrachtung von Klassen
Betrachtung des Inneren von Klassen
Dynamischer Aufruf von Methoden
Performance-Überlegungen
System-Hooks
Runtime-Callbacks
Ablaufverfolgung des Programms
Wo kommen wir her?
Marshaling und verteiltes Ruby
Empfohlene Startegie zur maßgeschneiderten Serialisierung
Verteiltes Ruby
Kompilier-Zeit? Laufzeit? Jederzeit!



Eingebaute Klassen und Methoden




Standard-Library




Bibliotheken für objekt-orientiertes Design

Das Besuchs-Muster



Netzwerk- und Web-Bibliotheken

Socket-Level Access
Higher-Level Access
CGI Development
HTML-Ausgabemethoden
Werte in mehrteiligen Formularen



Microsoft Windows Support




Eingebettete Dokumentation

Inline-Formatierung
Kreuz-Referenzen
Methoden-Namen
Andere Dateien einbinden
rdtool benutzen
Haftungs-Ausschluss



Interactive Ruby Shell

Komandozeile
Initialisierungs-Datei
Kommandos
Den Prompt konfigurieren
Beschränkungen
rtags, xmp nd die Frame-Klasse
rtags
xmp
Die Klasse Frame



Support

Web Sites
Download Sites
Usenet-Newsgruppen
Mailing-Listen
Bug-Reports



Index




GNU Free Documentation License




GNU Freie Dokumentations Lizenz


Extracted from the book "Programming Ruby - The Pragmatic Programmer's Guide"
Übersetzung: Jürgen Katins
Für das englische Original:
© 2000 Addison Wesley Longman, Inc. Released under the terms of the Open Publication License V1.0. That reference is available for download.
Diese Lizenz sowie das Original vom Herbst 2001 bilden die Grundlage der Übersetzung
Es wird darauf hingewiesen, dass sich die Lizenz des englischen Originals inzwischen geändert hat.
Für die deutsche Übersetzung:
© 2002 Jürgen Katins
Der Copyright-Eigner stellt folgende Lizenzen zur Verfügung:
Nicht-freie Lizenz:
This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at http://www.opencontent.org/openpub/). Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder. Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.
Freie Lizenz:
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".