Die Programmiersprache Ruby

Blog|

Forum|

Wiki  


Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]

Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Ruby benutzt keine Iteratoren?!
BeitragVerfasst: 11 Okt 2008, 23:07 
Offline
ri
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 765
Wohnort: NRW -> MK || UN
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"! :shock:
Was meint ihr dazu?

Hier der Link:
http://de.wikipedia.org/wiki/Ruby_%28Pr ... l.C3.B6cke

Quintus

_________________
Die Planung für einen OpenSource-RPG-Maker in Ruby ist im Gange! Wenn du Ideen hast, poste sie in diesem Thread hier im Forum oder diskutiere auf unserer Wikiseite mit (nach der Anmeldung über den "Diskutieren"-Button oben-rechts am Anfang des Artikels)!
_____________________________
Aetas nulla ad discendum sera.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 12 Okt 2008, 12:53 
Offline
Interpreter
Benutzeravatar

Registriert: 03 Jul 2006, 14:53
Beiträge: 4302
Wohnort: RLP
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.


Zuletzt geändert von Skade am 12 Okt 2008, 14:37, insgesamt 2-mal geändert.

Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 12 Okt 2008, 14:12 
Offline
Hacker
Benutzeravatar

Registriert: 08 Mai 2007, 20:03
Beiträge: 451
Wohnort: Köln
Ich habe einfach mal die Iteratoren im Wikipedia-Artikel wieder eingesetzt. Mal sehen, ob es jemand zurück "korrigiert".

Viele Grüße
klausb


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 12 Okt 2008, 14:34 
Offline
ri
Benutzeravatar

Registriert: 18 Sep 2008, 22:32
Beiträge: 765
Wohnort: NRW -> MK || UN
Na dann bin ich ja beruhigt. :)
Ich dachte schon, mein Verständnis von Ruby sei komplett über den haufen geworfen... :)

Quintus

_________________
Die Planung für einen OpenSource-RPG-Maker in Ruby ist im Gange! Wenn du Ideen hast, poste sie in diesem Thread hier im Forum oder diskutiere auf unserer Wikiseite mit (nach der Anmeldung über den "Diskutieren"-Button oben-rechts am Anfang des Artikels)!
_____________________________
Aetas nulla ad discendum sera.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 12 Okt 2008, 14:44 
Offline
Interpreter
Benutzeravatar

Registriert: 05 Jun 2005, 01:54
Beiträge: 3225
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 ;)

_________________


1
2
3
alias L lambda
p L{|y|L{|f|y[L{|x|f[f][x]}]}[L{|f|y[L{|x|f[f][x]}]}]}[L{|z|L{|l|l.empty?? 0:1+z[l.drop(1)]}}][%w<a b c d e f g h i j>]
#=>10


Nuclear Powered Soup | Nuclear Powered Blog


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 14 Okt 2008, 13:01 
Offline
Böser Admin
Benutzeravatar

Registriert: 29 Jul 2005, 22:41
Beiträge: 1867
Wohnort: Hannover
Schön das wieder an dem Artikel gearbeitet wird. Vor zwei Jahren hab ich mir wegen diesem beinahe die Haare ausgerissen )-:


/daniel

_________________
511.rb | Ruby-Mine | Homepage


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 14 Okt 2008, 14:42 
Offline
Interpreter
Benutzeravatar

Registriert: 03 Jul 2006, 14:53
Beiträge: 4302
Wohnort: RLP
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


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 23 Okt 2008, 17:02 
Offline
Interpreter
Benutzeravatar

Registriert: 03 Jul 2006, 14:53
Beiträge: 4302
Wohnort: RLP
Scheint nicht viel geholfen zu haben. Der alte Autor hats zurueck geaendert.

Gruss,
Skade


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 23 Okt 2008, 21:06 
Offline
Interpreter
Benutzeravatar

Registriert: 15 Mär 2005, 19:26
Beiträge: 5864
Wohnort: Karlsruhe
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.
  • Ruby wurde seitens Matz für ihn selber entworfen - sprich - sollte die Ansprüche eines erfahrenen Programmierers erfüllen, dessen Lieblingseditor nach eigenen Aussagen Emacs ist.
  • Er hält Ruby als Einsteigersprache eher für ungeeignet, weil die Sprache viele kleine Gemeinheiten in den Details besitzt. Dies hat er so gewollt, damit die Sprache für einen erfahrenen Programmierer bequem anzuwenden ist.
  • Er sieht Ruby nicht als Sprache für grosse Projekte an. Dies in erster Linie wohl deshalb, weil es die vielfältigen (syntaktischen) Möglichkeiten ermöglichen, dass jeder erfahrene Programmierer sich die Sprache für seine Anwendungen selber zurechtbiegen kann.

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...

1
2
3
4
5
6
7
8
9
10
11
12
module Kernel
# Ignores its optional block.
def dont
end
end

class Foo
#module KurpW
dont do
Version = 08.17
end
end

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.

_________________
WoNáDo.set_state!(:active)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 23 Okt 2008, 23:32 
Offline
Interpreter
Benutzeravatar

Registriert: 03 Jul 2006, 14:53
Beiträge: 4302
Wohnort: RLP
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


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 23 Okt 2008, 23:51 
Offline
Interpreter
Benutzeravatar

Registriert: 15 Mär 2005, 19:26
Beiträge: 5864
Wohnort: Karlsruhe
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.

_________________
WoNáDo.set_state!(:active)


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: 20 Dez 2008, 03:42 
Offline
Nuby

Registriert: 24 Aug 2006, 14:11
Beiträge: 8
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.

_________________
Programmer - an organism that turns coffee into software. (Anonymous)


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach: