Uniform Function Call Syntax (UFCS)

L'UFCS est une des fonctionnalités clés de D, qui permet la réutilisabilité du code et une bonne encapsulation.

L'UFCS permet d'appeller n'importe quelle fonction fun(a) avec la syntaxe a.fun().

Si le compilateur évalue l'expression a.fun() et que le type de a n'a pas de méthode appellée fun(), il essaye de trouver une fonction globale dont le premier paramètre a le même type que a.

Cette fonctionnalité est particulièrement utile quand on veut enchaîner les appels à des fonctions. Au lieu d'écrire

foo(bar(a));

On peut écrire

a.bar().foo();

De plus, les parenthèses sont optionelles quand une fonction est appellée sans arguments, ce qui signifie que n'importe quelle fonction peut être utilisée comme une propriété:

import std.uni : toLower;
"D est génial !".toLower; // "d est génial !"

L'UFCS est particulièrement utile quand on travaille avec les ranges, sur lesquelles on peut enchainer plusieurs opérations complexes, avec un style clair et maintenable.

import std.algorithm : group;
import std.range : chain, retro, front;

[1,2].chain([3,4]).retro; // 4, 3, 2, 1
[1,1,2,2,2].group.dropOne.front; // tuple(2, 3u);

Pour aller plus loin

rdmd playground.d