Das ist etwas geschwurbelt und IMHO das Geschreibsel von jemanden, der unbedingt seine Geistesblitze präsentieren wollte. [2]
Zuerst mal theoretisch: ein Iterator als Konzept (nicht als Entwurfsmuster nach der
Gang of Four) beschreibt einfach einen Zeiger, mit dem ich eine Menge von Objekten in vordefinierter Art und Weise sequentiell abarbeiten kann. Auch sind
each,
map etc. in Ruby eindeutig der funktionalen Welt zuzuordnen und damit nur schlecht mit OO-Begriffen zu beschreiben.
Visitor wiederrum ist ein Begriff aus der objektorientierten Welt und nur dort wirklich gültig. Nach der Definition des Autors würde
map als Funktion höherer Ordnung ein Visitor-Pattern definieren.
Ich hab jetzt meine Ausgabe der
Gang of Four auf Arbeit liegen, aber meines Wissens beschreibt
Visitor, dass das von einem
Visitor besuchte Objekt explizit und aktiv Besucher empfängt (und damit aktiv beeinflussen kann, was für Typen es verändern dürfen). Das ist im Falle von
each nicht der Fall. Das Element der Collection wird dem Block übergeben, der Vorgang ist also mehr mit der Anwendung einer
Funktion (funktional oft
apply genannt) oder dem Pattern
Strategy (wenn man unbedingt in der OO-Welt bleiben will) zu vergleichen.
Konkret in Ruby:
Blöcke, each, etc. sind in Ruby komplexer als ihre Beschreibung.
#each ist eindeutig ein Iterator, was sich in Ruby auch damit ausdrückt, dass ab 1.8.7 folgendes möglich ist:
1 2
|
a = [].each #a enthält nun ein Iterator-Objekt
|
Der Iterator ist also each, das hat mit dem Block erstmal nichts zu tun. Und das ist eindeutig ein rein vorwärts laufender Iterator, da gibt es wenig zu diskutieren.
Genauso werden Blöcke auch nach komplexen Regeln optimiert. Solange ich Ruby nicht explizit zwinge, einen Block zu instanziieren, wird dieser z.B. auch gerne mal inlined. Das ganze entspricht dann fast dem iterierenden for in Java:
1 2 3 4
|
for (Int i : intArray) { //bla } |
Also ums kurz zu machen:
Strategy[1] ja,
Visitor nein,
Iteratoren sind auf jeden Fall dabei. Aber objektorientierte Konzepte sind hier die falsche Beschreibung.
Gruß,
Skade
[1]:
Strategy ist eh nur ein Hack für Sprachen, die Funktionen nicht als Objekte erster Klasse handhaben können.
Edit: Ich habe die Diskussion ums verschieben dieses Threads gelöscht. Stört den Lesefluss.
[2]: Nachtrag: Ich hoffe, ich bin hier niemandem auf die Füsse getreten, der sich die Mühe macht, am deutschen Artikel zu Ruby auf der Wikipedia zu arbeiten. Ich komme immer bis zur Diskussionsseite und stelle dann fest, dass die Kultur der deutschen Wikipedia nicht meine ist.