[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [OT] Python oder Perl



On 02.Aug 2005 - 21:58:28, Thorsten Haude wrote:
> * Frank Küster wrote (2005-08-02 10:09):
> >- Python verwendet zum Erstellen der Liste ein Kommando mit intuitiv
> >  verständlichem Namen (os.listdir('<directory>'), Ruby dagegen offenbar
> >  ein Suffix .each hinter dem Namen der Variable, die auf das
> >  Verzeichnis zeigt.
> 
> Nicht ganz, eine Liste wird in Ruby an dieser Stelle nicht erzeugt.

Bei Pythons __iter__ wird auch keine Liste erzeugt, es wird einfach nur
ein Objekt erzeugt mit dem man ueber die Liste iterieren kann. IIRC.

> Stattdessen wird an das Objekt dir eine Nachricht geschickt, die in
> diesem Fall lautet: "Führe folgenden Block mal für jedes Deiner
> Elemente aus." Das erlaubt es, innerhalb der Methode each noch
> beliebig komplizierte Dinge anzustellen, bevor man wie gewünscht den
> Block aufruft.

Geht mit Python's __iter__ natuerlich auch. Der for-Block ist dann
letzen Endes wirklich nur die Iteration selbst. 

> 
> >  Zumal dann, wenn .each auch auf anderen Dingen als
> >  Verzeichnissen agieren kann (z.B. URLs oder Datenbank-dingsens).
> 
> Wo ist dabei das Problem? Wenn Du Dateien aus einer URL lesen willst,
> machst Du vielleicht einen Fehler, oft ist es aber nützlich, wenn Du
> Deine Objekte verschiedener Klassen gleich behandeln kannst. In Java
> würde man dazu viele Casts verwenden, in Ruby ist das nicht nötig. Das
> ist also kein Problem:

Nicht zwangsweise, zum einen sind die Container in Java alle auf Object
basierend und du hast somit ein paar Funktionen. Zum anderen kannst du
natuerlich per Interfaces festlegen, welche Funktionen ein Array-Element
implementieren muss und mit den "templates" in Java1.5 braucht man dann
dort keine Casts mehr. 

> Irgendwoanders im Code kannst Du dann alles ausgeben:
> 
>     array.each { |thing|
>         thing.each { |element|
>             print element
>         }
>     }

Was passiert in Ruby wenn ein Element des Arrays die Methode each nicht
implementiert? In Java geht sowas beim Compilieren schief (ausser man
benutzt Casts), in Python gibts einen Laufzeitfehler und ich nehme an in
Ruby auch. Das sind aber eigentlich die "haesslichsten" Fehler, denn die
passieren meistens erst beim Kunden...

Nicht das ich jetzt hier Java hochleben lassen will, da kanns genauso
"knallen" (wenn gecastet wird), wollte das nur anmerken. Ich find Python
ja bisher auch am "huebschesten" (kenn ja Ruby noch nciht ;-)

> >- und schließlich finde ich das Fragezeichen hinter .stat.directory
> >  (oder steht es hinter if <test>?) irgendwie albern, aber vielleicht
> >  ist das etwas, was man sehr schätzen lernt: Kommandos, die einen
> >  Wahrheitswert zurückliefern, haben hinten ein Fragezeichen.
> 
> Das Fragezeichen ist Teil des Methodennamens. Es ist nur eine
> Konvention, daß Bool'sche Methoden so benannt werden, aber nützlich
> ist es allemal.
>
> Es gibt außerdem noch die Konvention, ein ! an den Methodennamen
> anzuhängen, wenn das Objekt verändert wird. Zum Beispiel gibt
>     array.compact
> einfach einen Array zurück, aus dem leere Elemente entfernt werden,
>     array.compact!
> verändert aber array selbst.

Interessante Konventionen und auch das Ruby solche Sonderzeichen
zulaesst. Wird das vom Interpreter "enforced"? Gibts andere Sprachmittel
um das Veraendern eines Objektes zu verhindern, ala const in C++?

Andreas

-- 
You will live to see your grandchildren.



Reply to: