UFCS є ключовою особливістю мови D та дозволяє повторне використання коду та масштабування за допомогою чітко сформульованої інкапсуляції.
UFCS допускає, що будь-який виклик вільної функції fun(a)
можна
записати у вигляді виклику функції a.fun()
.
Якщо компілятор бачить a.fun()
, а тип не має власну функцію під
назвою fun()
, він намагається знайти глобальні функції, перший
параметр яких співпадає з а
.
Ця можливість особливо корисна, коли треба поєднати виклики складних функцій. Замість того, щоб писати
foo(bar(a))
Можна написати
a.bar().foo()
Крім того, у мові D не потрібно використовувати круглі дужки для функцій без аргументів, що означає, що будь-яка функція може бути використана, як властивість:
import std.uni : toLower;
"D найкращий".toLower; // "d найкращий"
UFCS особливо важливий при роботі з діапазонами (ranges), де кілька алгоритмів можна поєднати разом, щоб виконувати складні операції, все ще дозволяючи писати чіткий та підтримуваний код.
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