UFCS es una característica clave en D que habilita la reusabilidad y la escalabilidad del código a través de encapsulación bien definida.
UFCS permite que cualquier llamada a una función libre, fun(a)
, pueda ser
escrita como una llamada a un método, a.fun()
.
Si el compilador ve la llamada a.fun()
y el tipo de a
no tiene un miembro
llamado fun()
, trata de encontrar una función global cuyo primer parámetro
sea del mismo tipo que a
.
Esta característica es especialmente útil para encadenar llamadas complejas a funciones. En lugar de escribir:
foo(bar(a))
Es posible escribir:
a.bar().foo()
Además, en D no es necesario usar los paréntesis para llamar a funciones que no tienen argumentos, lo que significa que cualquier función se puede usar como una propiedad:
import std.uni : toLower;
"D mola".toLower; // "d mola"
UFCS es especialmente importante cuando se trabaja con rangos (ranges en inglés) donde varios algoritmos se encadenan para realizar operaciones complejas pero manteniendo la legibilidad y manejabilidad del código.
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)
std.range