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?
pgp6ZJRtUqKSF.pgp
Description: PGP signature

