Вопрос

Эй, ребята, я пытаюсь получить эти кусочки синтаксиса, чтобы иметь смысл для меня:

S[] split(S)(S s) if (isSomeString!S)
{
    ...
}

а также

string join(in string[] words, string sep)
{
    ...
}

(Как видно в phobos/src/std/string.d)

Насколько я могу судить, это кусок кода, который позволяет нам делать такие вещи, как:

string[] parts = "/foo/bar/baz".split("/"); // string[] {"foo", "bar", "baz"}
string part = parts.join("-"); // string "foo-bar-baz"

Что в основном заставляет меня поверить в то, что методы расширения, которые я знаю из CSHARP, возможны в d. Проблемы, с которыми у меня есть:

  1. Что я не на 100% уверен, что смотрю на правильные объявления функции здесь
  2. Что я не вижу, что делает их похожими.
Это было полезно?

Решение

Это не методы расширения на SE, просто некоторая ошибка, которая превратилась в аккуратную функцию.

Сходство между этими двумя методами заключается в том, что оба имеют строку в качестве первого параметра. Таким образом, трюк, который здесь работает, заключается в том, что с учетом массива t [] arr и функции

U foo (T[] t, other params)

может быть вызван, делая

arr.foo(some arguments matching other params)

Другие советы

В 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);

Но поскольку синтаксис вызовов функций в униформе еще не реализован, вы можете делать только такие вещи с массивами. Люди довольно часто программируют с помощью струн, а не передавать их в качестве первого аргумента функции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top