Menu

Універсальний синтаксис виклику функції (UFCS)

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)

Поглиблення

rdmd playground.d