VorbemerkungDieser Artikel ist _in Arbeit_ und daher bei weitem nicht vollständig. Enumerables in RubyWas in Java oder anderen Sprachen das Collection-API ist, sind in Ruby Enumerables. Der Name leitet sich aus der theoretischen Idee der rekursiv aufzählbaren Menge ("Recursively enumerable set") her. Hier zeigt sich, dass der Ruby-Kern hin und wieder mal Begrifflichkeiten der theoretischen Informatik orientiert, was manchmal etwas ungewohnt sein kann. Dieser Artikel soll eine praktische Einführung in die Ideen hinter der Verarbeitung von Listen, Dictionaries (Hashes), unsortierten Mengen (Set) und selbst implementierte Enumerables geben. Ruby geht hier einen sehr eigenen Weg, denn das Enumerable-API basiert stark auf Konzepten, die funktionalen Programmiersprachen entlehnt sind. Daher kann die Arbeit für Nutzer anderer imperativer Programmiersprachen etwas ungewohnt sein, vor allem durch die Abwesenheit expliziter Schleifen. Ein gutes Verständnis des Enumerable-API ist voll allergrößter Wichtigkeit für jeden Ruby-Programmierer! Enumerables im Core-APIEnumerables spielen in Ruby eine zentrale Rolle. Das Core-API enthält folgende Enumerable-Klassen: Array, Hash, Range, File und Dir. In Ruby 1.8 kommt noch String dazu, der in 1.9 diesen Status allerdings verloren hat. Dafür kommen in Ruby 1.9 Enumerator, Enumerator::Generator und Enumerator::Yielder hinzu. Zu beachten ist, dass die Ruby-Implementierung von Set Teil der Standard-API ist, deren große Menge an Enumerable-Klassen hier nicht aufgelistet werden soll. Alle Enumerable-Klassen teilen sich eine Eigenschaft: sie enthalten das Modul Enumerable. Dieses implementiert die Grundoperationen auf Enumerables, jedoch steht es jeder Klasse frei, diese selbst zu implementieren. Grundsätzlich sollten sie sich dabei aber an das von Enumerable vorgegebene Verhalten halten. Für alle Core-Klassen gilt dass die meisten Enumerable-Methoden in C implementiert sind und damit recht effizient arbeiten - sie sind selbst geschriebenen also vorzuziehen. AnwendungsbeispieleVorweg einige Anwendungsbeispiele, damit wir nicht ganz im Freien schweben. Wir werden uns im folgenden mit Problemen beschäftigen wie:
Die Idee: map/filter/reduceDie grundsätzliche Idee hinter dem Enumerable-API stammt auch aus der funktionalen Welt und ist daher nicht jedem geläufig: map/filter/reduce. Grundsätzlich ist die Idee folgende: So gut wie alle Operationen auf Enumerables sind durch 3 Vorgehensweisen beschreibbar. Diese drei sind:
EnumeratorenEigene Enumerables implementieren |
|||||||||||||||||||||||