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

Re: [OT] Python oder Perl



Moin,

* Andreas Pakulat wrote (2005-08-02 23:20):
>On 02.Aug 2005 - 21:58:28, Thorsten Haude wrote:
>> * Frank Küster wrote (2005-08-02 10:09):
>> >  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.

Naja, wohl kaum etwas sinnvolles.


>Zum anderen kannst du natuerlich per Interfaces festlegen, welche
>Funktionen ein Array-Element implementieren muss

Klar, dann kann ich aber nur Objekte von den Klassen reinpacken, von
denen ich das schon vorher weiß.


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

So würde das passieren. Du kannst natürlich vorher fragen, ob das
Objekt die Methode kennt:

    array.each { |thing|
        thing.each { |element|
            print element
        } if thing.respond_to?(:each)
    }

Für die ganz Mutigen geht es auch anders (und das erklärt dann auch,
warum das bei Ruby kein Compilerfehler sein kann:

    array.each { |thing|
        if ! thing.respond_to?(:each)
            def thing.each
                yield("I don't know how to do 'each', so I just return this string")
            end
        end
        thing.each { |element|
            print element
        }
    }


>Nicht das ich jetzt hier Java hochleben lassen will, da kanns genauso
>"knallen" (wenn gecastet wird), wollte das nur anmerken.

Das ist ein Argument für Rubys Duck Typing: Der Programmierer muß in
jedem Fall darauf achten, welchen Typ seine Objekte haben, warum also
das nicht zu seinem Feature machen?


>> 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"?

Nö.


>Gibts andere Sprachmittel um das Veraendern eines Objektes zu
>verhindern, ala const in C++?

Du kannst Konstanten haben, wenn Du welche willst. Dazu gibt es eine
Konvention, die auch der Interpreter kennt: Konstanten beginnen mit
einem Großbuchstaben. Allerdings (und das stört mich) kann man den
Wert von Konstanten ändern. Der Interpreter warnt zwar, schön ist das
deswegen aber noch nicht.


Thorsten
-- 
Why are there only two people who run for president and 50 for Miss America?

Attachment: pgpCtvvRLAD5l.pgp
Description: PGP signature


Reply to: