| rubyforen.de http://forum.ruby-portal.de/ |
|
| Ruby benutzt keine Iteratoren?! http://forum.ruby-portal.de/viewtopic.php?f=6&t=8166 |
Seite 1 von 1 |
| Autor: | Quintus [ 11 Okt 2008, 23:07 ] |
| Betreff des Beitrags: | Ruby benutzt keine Iteratoren?! |
Hallo Community, Bin gerade mal ein bisschen durch die Wikipedia gesurft und hab mir mal den Artikel zu Ruby (Programmiersprache) angesehen. Dabei habe ich die erschreckende Erkenntnis gewonnen: Ruby hat keine Iteratoren! Was wir als solche bezeichnen sind laut Wikipedia "Visitatoren kombiniert mit sogenannten Blöcken"! Was meint ihr dazu? Hier der Link: http://de.wikipedia.org/wiki/Ruby_%28Pr ... l.C3.B6cke Quintus |
|
| Autor: | Skade [ 12 Okt 2008, 12:53 ] | ||||
| Betreff des Beitrags: | |||||
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:
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:
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. |
|||||
| Autor: | klausb [ 12 Okt 2008, 14:12 ] |
| Betreff des Beitrags: | |
Ich habe einfach mal die Iteratoren im Wikipedia-Artikel wieder eingesetzt. Mal sehen, ob es jemand zurück "korrigiert". Viele Grüße klausb |
|
| Autor: | Quintus [ 12 Okt 2008, 14:34 ] |
| Betreff des Beitrags: | |
Na dann bin ich ja beruhigt. Ich dachte schon, mein Verständnis von Ruby sei komplett über den haufen geworfen... Quintus |
|
| Autor: | cypher [ 12 Okt 2008, 14:44 ] |
| Betreff des Beitrags: | |
Quintus hat geschrieben: Ich dachte schon, mein Verständnis von Ruby sei komplett über den haufen geworfen... Glaub nicht alles was du auf Wikipedia liest |
|
| Autor: | DanielBovensiepen [ 14 Okt 2008, 13:01 ] |
| Betreff des Beitrags: | |
Schön das wieder an dem Artikel gearbeitet wird. Vor zwei Jahren hab ich mir wegen diesem beinahe die Haare ausgerissen )-: /daniel |
|
| Autor: | Skade [ 14 Okt 2008, 14:42 ] |
| Betreff des Beitrags: | |
klausb hat geschrieben: Ich habe einfach mal die Iteratoren im Wikipedia-Artikel wieder eingesetzt. Mal sehen, ob es jemand zurück "korrigiert".
Viele Grüße klausb Muesste erstmal wer abnehmen... Aber ich hab heute mal in der GoF nachgeschaut: ja, Visitoren setzen voraus, dass das empfangende Objekt Besucher akzeptiert. Es muesste also aktiv den Block nehmen, pruefen und ausfuehren. Gruss, Skade |
|
| Autor: | Skade [ 23 Okt 2008, 17:02 ] |
| Betreff des Beitrags: | |
Scheint nicht viel geholfen zu haben. Der alte Autor hats zurueck geaendert. Gruss, Skade |
|
| Autor: | WoNáDo [ 23 Okt 2008, 21:06 ] | ||
| Betreff des Beitrags: | |||
Ich weiss nicht, ob der Versuch Ruby auf klassische Art in den Details zu beschreiben, von Erfolg gekrönt sein kann. Ruby ist in erster Linie eine pragmatische Sprache. Matz hat diverse Male in Videos Äusserungen gemacht, die nach Entfernung aller redundanten Elemente (~Höflichkeitsfloskeln etc.) eindeutige Aussagen machen.
Rubys Grundidee, dass alles Objekt sei, stammt zwar vom Smalltalk-Elternteil, aber das Perl-Elternteil, sprich die an den Ansprüchen eines Programmierers orientierte Syntax, der statt diverser Tools einer Unix-Umgebung alles in einer kompakten Sprache haben will, ist in der praktischen Anwendung von Ruby deutlicher ausgeprägt. Auch am Thema der Blöcke in Ruby kann man das alles sehr schön sehen. murphy hat doch mal in der Ruby-Mine einen Artikel gechrieben, in dem Blöcke zum Auskommentieren von Code benutzt werden...
In anderen Fällen dienen sie dazu, um lazy Evaluation zu erreichen - werden also von einer Methode erst und nur dann ausgeführt, wenn sie benötigt werden. Sehr oft sind sie einfach ein namenloses Proc-Objekt, welches intern in einer Aufrufhierarchie eventuell sogar beliebig weitergegeben wird. Hin und wieder, speziell bei Objekten die aufzählbar sind, werden sie auch für Schleifen benutzt. Ach ja - dann ist da noch die Möglichkeit Blöcke zu benutzen, wenn durch den Code im Block Elemente der Klasse manipuliert werden, zu der die aufgerufene Methode gehört. So etwas wird beispielsweise bei RubyTk in grossem Umfang eingesetzt. Ich benutz(t)e etwas ähnliches von Ruby 1.9 (Auswertung mittels instance_exec) in meinen Versuchen mit ReMacPro (derzeit eingestellt, bis Ruby 1.9.1 da ist). Auf Wikipedia halte ich es für vergebliche Liebesmüh sich bezüglich Ruby zu engagieren. Je nach Erfahrung und Blickpunkt werden je zwei Leute schon (stark) unterschiedliche Sichtweisen haben. |
|||
| Autor: | Skade [ 23 Okt 2008, 23:32 ] |
| Betreff des Beitrags: | |
WoNáDo hat geschrieben: Auf Wikipedia halte ich es für vergebliche Liebesmüh sich bezüglich Ruby zu engagieren. Je nach Erfahrung und Blickpunkt werden je zwei Leute schon (stark) unterschiedliche Sichtweisen haben.
Das mag so sein, etwas ähnliches habe ich ja auch versucht, auszudrücken. Wir auch immer - Visitor ist aber eindeutig das falsche Pattern, um die auf der Wikipedia verwendeten Beispiele zu beschreiben. Aber danke für die Ausführungen, du hast aus Versehen genau das zusammengefasst, was ich gerade brauche Gruss, Skade |
|
| Autor: | WoNáDo [ 23 Okt 2008, 23:51 ] |
| Betreff des Beitrags: | |
Skade hat geschrieben: Aber danke für die Ausführungen, du hast aus Versehen genau das zusammengefasst, was ich gerade brauche
Eine Zusammenfassung zu Blöcken in Ruby fiel mir gerade eben ein - Blöcke in Ruby sind syntaktischer Zucker, der bei Bedarf auch als Pfeffer oder Salz eingesetzt werden kann. |
|
| Autor: | Stoiker [ 20 Dez 2008, 03:42 ] |
| Betreff des Beitrags: | |
Skade hat geschrieben: und stelle dann fest, dass die Kultur der deutschen Wikipedia nicht meine ist. Auch ansonsten sehr treffende Posts von dir! WoNáDo hat geschrieben: Auf Wikipedia halte ich es für vergebliche Liebesmüh sich bezüglich Ruby zu engagieren. Je nach Erfahrung und Blickpunkt werden je zwei Leute schon (stark) unterschiedliche Sichtweisen haben.
Das betrifft einige IT-Themen dort, nicht nur Ruby. Perfide sind auch die Löschtrolle ganzer Artikel per formal korrektem Löschantrag. |
|
| Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|