Dookie hat geschrieben:Jo in Python geht das zum Glück nicht so. Wenn da jeder die Methoden bei Builtins mit seinen eigenen überschreibt, ist der Code bald nicht mehr lesbar, Perl lässt grüssen

stimmt; auch in der Ruby-community gibt es starke gegner dieser technik, und es gilt als "nicht sauber". aber mit Perl hat das sicher nichts zu tun.
mawe hat geschrieben:Ja, bin ganz Deiner Meinung. Mir ist auch noch nie in den Sinn gekommen so etwas zu machen, man siehts aber sehr oft in Rubycode.
das hat gründe: es macht vieles nämlich sehr einfach.
beispiel: ich möchte das interface zur ZLib-bibliothek (= gzip) vereinfachen.
Code: Alles auswählen
class String
# Returns the string, unzipped.
# See GZip.gunzip
def gunzip
GZip.gunzip self
end
# Returns the string, zipped.
# +level+ is the gzip compression level, see GZip.gzip.
def gzip level = GZip::DEFAULT_GZIP_LEVEL
GZip.gzip self, level
end
end
jetzt brauche ich nur noch zu schreiben:
ich sehe keine gefahr für den code.
in kleinen skripten ist es auch nützlich, to_s (__str__) überschreiben zu können. oder man baut sich ein NAND für booleans, was Ruby ja eigentlich nicht hat. dann kann man false / true schreiben.
manchmal fehlen einem auch einfach funktionen in Ruby; es wäre viel unsauberer und verwirrender, sie nicht gleich in die zugehörige klasse zu packen:
builtin-methoden zu
überschreiben ist allerdings ein gefährliches spiel. ich habe mal * und + für Fixnum vertauscht - mit dem erfolg, dass gar nichts mehr funktionierte.
kann man in Python klassen von den basisklassen (int, dict, tuple, list, string) ableiten?