Uniform Function Call Syntax (UFCS)

UFCS (dt. etwa: einheitliche Funktionsaufruf-Syntax) ist ein Hauptmerkmal von D, dass Wiederverwendbarkeit und Skalierbarkeit durch klar definierte Kapselung ermöglicht.

UCFS erlaubt es, den Aufruf der freien Funktion fun(a) als Memberfunktionsaufruf a.fun() zu schreiben.

Wenn a.fun() vom Compiler gesehen wird, und der Typ von a keine Memberfunktion fun() besitzt, wird versucht eine globale Funktion zu finden, deren erster Parameter dem von a entspricht.

Dieses Feature ist besonders bei der Verkettung von Funktionsaufrufen nützlich.

foo(bar(a))

kann dank UFCS auch so geschrieben werden:

a.bar().foo()

Ferner können in D bei Funktionen ohne Argumente die runden Klammern weggelassen werden. Somit kann jede Funktion wie ein Property verwendet werden:

import std.uni : toLower;
"D rockt!".toLower; // "d rockt!"

UFCS ist besonders beim Umgang mit Ranges wichtig, wo mehrere Algorithmen zu komplexen Operationen zusammengefügt werden können. Dies führt zu klarem und wartbarem Code:

import std.algorithm : group;
import std.range : chain, retro, front, retro;
[1, 2].chain([3, 4]).retro; // 4, 3, 2, 1
[1, 1, 2, 2, 2].group.dropOne.front; // tuple(2, 3u)

Weiterführende Quellen

rdmd playground.d