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 positive

Alle 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); # 120

Der 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.

  1. Mengenrabatt
  2. Absolutwert
  3. Die Größe klassifizieren

Kursnavigation

Quiz — Der Doppelpunkt-Aufruf   |   Mengenrabatt