Raku-Kurs / Fortgeschritten / Subroutinen
Mehrfach-Dispatch
Im Teil „Grundlagen” haben Sie Multi-Funktionen kennengelernt: mehrere Subroutinen, die denselben Namen teilen, wobei Raku anhand der Typen der Argumente die richtige auswählt. Dieser Mechanismus wird Multiple Dispatch genannt.
Bisher wurde die Auswahl anhand des Typs der Argumente
getroffen. Eine where-Klausel erlaubt es, noch weiter zu
gehen und auch anhand des Werts zu dispatchen. Sie wird nach
einem Parameter geschrieben und enthält eine Bedingung, die das Argument
erfüllen muss, damit dieser Kandidat gewählt wird:
multi sub info(Int $n where $n < 0) { say "$n is negative" }
multi sub info(Int $n where $n == 0) { say "$n is zero" }
multi sub info(Int $n where $n > 0) { say "$n is positive" }
info(-5);
info(0);
info(7);Jeder Aufruf geht an den Kandidaten, dessen Bedingung für den gegebenen Wert wahr ist:
-5 is negative
0 is zero
7 is positiveAlle drei Kandidaten haben dieselbe Signatur, was die Typen betrifft
— ein einzelnes Int — ohne die where-Klauseln
würden sie also kollidieren. Die Bedingungen machen sie
unterscheidbar.
Ein Basisfall für die Rekursion
Ein häufiger Einsatz von where besteht darin, den
Endpunkt einer Rekursion als separaten Kandidaten bereitzustellen. Hier
ist erneut die Fakultät, aufgeteilt in zwei Multi-Subs:
multi sub fact(Int $n where $n <= 1) { 1 }
multi sub fact(Int $n) { $n * fact($n - 1) }
say fact(5); # 120Der erste Kandidat behandelt den Basisfall ($n von
1 oder kleiner) und gibt einfach 1 zurück.
Jeder andere Wert geht an den zweiten Kandidaten, der fact
erneut mit einer kleineren Zahl aufruft. Es gibt kein if
innerhalb der Funktion — die Wahl zwischen Basisfall und rekursivem
Schritt wird vom Dispatcher getroffen.
Praxis
Lösen Sie 1 Quiz zum Inhalt dieses Themas.
Übungen
Dieser Abschnitt enthält 3 Übungen. Sehen Sie sich alle Themen dieses Abschnitts an, bevor Sie mit den Übungen beginnen.