Kai hat geschrieben:
Was meinst du damit? Methodenüberladung? Ich denke die klassische Methodenüberladung dürfte in Ruby schwierig werden, da Variablen keine Typen haben. Es wäre aber cool wenn man das case-Statement etwas tunen könnte, so dass es wie ein Pattern-Matching in funktionalen Sprachen arbeitet.
Nehmen wir als Beispiel eine Methode zur Berechnung der Fakultät einer Zahl. Mit Ruby kann man diese folgendermaßen implementieren:
1 2 3 4 5 6 7
|
def fak(n) if [0,1].include?(n) then 1 elsif n<0 then raise "n must be >= 0" else n*fak(n-1) end end |
Es ist eine einfache Berechnung, doch der größte Teil der Methode besteht aus Konditionen und Verzweigungen. Das schränkt die Lesbarkeit ein. Würde Ruby polymorphe Methoden anbieten, könnte ich folgendes machen:
1 2 3 4 5 6
|
def fak(n) n*fak(n-1) end def fak(1); 1; end def fak(0); 1; end def fak(*); raise "n must be >= 0"
|
Man sieht sofort, dass es sich bei der Methode im Kern um die Berechnung
n*fak(n-1) handelt. Die Verzweigungen, die den Blick auf das Wesentliche trüben, brauche ich nicht mehr, da die Bedingungen allein von den Methodensignaturen abgehandelt werden. Nur gibt es ein Problem: Ruby erlaubt das überschreiben einer Methode. Wie kann also Ruby unterscheiden, ob ich eine zweite Methodensignatur anlegen möchte oder die Bestehende überschreiben will?
Ich habe bisher auch ohne polymorphe Methoden in Ruby überlebt. Aber manchmal denke ich:
Hier könnte ich sowas jetzt gebrauchen.
_________________
stefankloeckner.blog.de"Deine Mauerzinnen mache ich aus Rubin und all deine Grenzen von erlesenen Steinen." - Die Bibel, Jesaja 52.54