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);
std.range