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