統一関数呼び出し構文 (UFCS)

UFCSはDの重要な機能で、明確なカプセル化によりコードに 再利用性とスケーラビリティを与えます。

UFCSによりaに属していない関数の呼び出しfun(a)をメンバ関数の呼び出し a.fun()として書くことができます。

コンパイラがa.fun()を見て、その型がfun()と呼ばれるメンバ関数を 持たない時、最初の引数がaの型にマッチするグローバル関数を探します。

この機能は複雑な関数呼び出しを連鎖させる時に特に便利です。こう書く代わりに

foo(bar(a))

こう書くことができます。

a.bar().foo()

加えて、Dでは引数のない関数に括弧を使う必要はなく、 これは任意の関数をプロパティのように使えるということを意味します:

import std.uni : toLower;
"D rocks".toLower; // "d rocks"

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