В D любая функция, которая принимает массив в качестве первого аргумента, может вызываться так, как если бы она была функцией-членом этого массива. А поскольку строки являются массивами, это будет включать строки. Итак, что-то вроде
T[] replace(in T[] array, in T[] from, in T[] to)
можно назвать двумя разными способами:
auto replacedStr1 = replace("hello world", "hello", "goodbye");
auto replacedStr2 = "hello world".replace("hello", "goodbye");
Эта функция в настоящее время работает только для массивов (IIRC возникла из-за ошибки, которая позволила это сделать, и было решено, что на самом деле это было приятно, поэтому она фактически стала частью языка), но предположительно в какой-то момент он будет работать для всех типов. Работа с ним для всех типов называется единообразным синтаксисом вызова функций. После этого вы сможете делать что-то вроде
auto bigger = 2.max(5);
Но поскольку единый синтаксис вызова функции еще не реализован, вы можете делать такие вещи только с массивами. Люди часто программируют таким образом со строками, а не передают их в качестве первого аргумента функции.