Menu

Унифицированный синтаксис вызова функций (UFCS)

UFCS - ключевая особенность D, открывающая новые возможности повторного использования и масштабирования кода посредством грамотно определённой инкапсуляции.

UFCS гласит, что любой вызов свободной функции fun(a) может быть записан как вызов функции-члена a.fun().

Если компилятор встречает a.fun(), и у типа отсутствует функция-член fun(), он попробует найти глобальные функции, чей первый параметр совпадает с типом a.

Эта особенность очень полезна в сложных цепочках вызовов. Вместо того, чтобы писать

foo(bar(a))

Можно написать

a.bar().foo()

Кроме того, в D отсутствует необходимость использования скобок для функций, не имеющих аргументов, а это означает, что любую функцию можно использовать в качестве свойства:

import std.uni : toLower;
"D рулит".toLower; // "d рулит"

UFCS особенно важен при работе с диапазонами, где можно совместить несколько алгоритмов для выполнения сложных операций, при этом используя понятный и поддерживаемый код.

import std.algorithm : group;
import std.range : chain, retro, front, dropOne;
[1, 2].chain([3, 4]).retro; // 4, 3, 2, 1
[1, 1, 2, 2, 2].group.dropOne.front; // tuple(2, 3u)

Подробнее

rdmd playground.d